SHELL脚本testsrv脚本(init脚本或者SysV脚本)

testsrv脚本(SysV脚本)

一、说明:

​ CentOS7已经使用Systemd来管理服务,推荐使用Systemd来管理服务。ubuntu18.04现在也是Systemd管理服务。

​ init.d是CentOS6时候常用的,不过现在,CentOS6,CentOS7,ubuntu16.04,ubuntu18.04照样可以用。

​ 该脚本一般都放在/etc/rc.d/init.d目录下

​ 该脚本可以接收start,stop,status,reload,restart等参数来管理服务

​ 基本上都会加载/etc/rc.d/init.d/functions,这个文件中有一些比较好用的函数

​ #chkconfig和#describe这两行都要写上,describe这个现在貌似可以不用写了。

#chkconfig:2345 96 07——必须写明,2345代表在这些模式下,开启testsrv功能,96代表开启编号为96 07代表关闭时的编号,相当于创建了一个软连接,这个不要和已有的编号重复,/etc/rc.d/rc5.d/看已有的编号

​ 再说明一下,CentOS7现在不使用init0-6来管理用户模式,也用systemd管理

二、题目

编写服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数:start, stop, restart, status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功” 考虑:如果事先已经启动过一次,该如何处理?

(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成” 考虑:如果事先已然停止过了,该如何处理?

(5) 如是restart,则先stop, 再start 考虑:如果本来没有start,如何处理?

(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running...”,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped...”

(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理 说明:SCRIPT_NAME为当前脚本名

三、脚本

[root@imooc-nginx init.d]# cat /etc/init.d/testsrv 
#!/bin/bash
# chkconfig: 2345 10 90
# description: testsrv
#
. /etc/init.d/functions

check_running(){
    [ -e /var/lock/subsys/`basename $0` ] &&
        STAT=0 ||
        STAT=1
}

do_status(){
    check_running
    if [ "$STAT" = "1" ];then
        action "`basename $0` is stopped..." false
    else
        action "`basename $0` is running..." true
    fi
}

do_start(){
    check_running
    if [ "$STAT" = "0" ];then
        action "`basename $0` 正在运行,取消操作..." true
        exit 0
    elif [ "$STAT" = "1" ];then
        touch /var/lock/subsys/`basename $0`
    fi
    check_running
    if [ "$STAT" = "0" ];then
        action "`basename $0` 启动成功..." true
    elif [ "$STAT" = "1" ];then
        action "`basename $0` 启动失败..." false
        exit 20
    fi
}

do_stop(){
    check_running
    if [ "$STAT" = "0" ];then
        rm -f /var/lock/subsys/`basename $0`
        check_running
        if [ "$STAT" = "1" ];then
            action "`basename $0` 停止成功..." true
        elif  [ "$STAT" = "0" ];then
            action "`basename $0` 停止失败..." false
            exit 10
        fi
    fi
}

do_restart(){
    check_running
    if [ "$STAT" = "0" ];then
        action "`basename $0` 已经运行,正在重新启动..." true
        do_stop
        do_start
    elif [ "$STAT" = "1" ];then
        action "`basename $0` 没有运行,正在启动..." true
        do_start
    fi
}

case "$1" in 
    start|stop|status|restart)
        do_$1
        ;;
    *)
        echo "缺少参数: start|stop|status|restart"
        ;;
esac

四、操作

CentOS7操作

[root@imooc-nginx init.d]# mv testsrv.sh testsrv
#将testsrv加入SysV服务
[root@imooc-nginx init.d]# chkconfig --add testsrv 
[root@imooc-nginx init.d]# chkconfig --list testsrv 

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

testsrv         0:关 1:关 2:开 3:开 4:开 5:开 6:关
#上面可以看到testsrv加入到了2345模式下开机启动,和配置文件中写的一样
#将该服务在345模式下关闭
[root@imooc-nginx init.d]# chkconfig --level 345 testsrv off
[root@imooc-nginx init.d]# chkconfig --list testsrv 

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

testsrv         0:关 1:关 2:开 3:关 4:关 5:关 6:关

启动关闭玩玩

SHELL脚本testsrv脚本(init脚本或者SysV脚本)

五、脚本详解

再说一下,CentOS7推荐systemd来管理服务,不建议用SysV管理

​ chkconfig 2345 10 90表示服务在2345四个模式下开启testsrv功能,10表示开启编号为96,07表示关闭的编号。

​ 这个编号要注意下,不能和其他重复了,init 1是单用户模式,该模式下绝大部分服务都是开机关闭的(K打头),/etc/rc.d/rc1.d/下面自己看看吧,选一个没用的开启编号。init 5是桌面图形化模式,很多服务是启动的,可以看看/etc/rc.d/rc5.d/下面哪些开启编号(S打头)占用了,选择一个关闭的编号

​ 如果不想该服务在任何模式下启动,那么把2345变成-

同时再说明一下:CentOS7不采用init0-6来管理启动模式,使用Systemd管理

六、chkconfig用法

这个现在也就是CentOS6用了,CentOS7虽然命令还在,但已经不用来管理服务了

查看所有服务的开机启动情况

[root@qqq init.d]# chkconfig --list

查看atd服务的开启启动情况

#2 3 4 5模式下开机启动
[root@qqq init.d]# chkconfig --list atd
atd             0:off   1:off   2:on    3:on    4:on    5:on    6:off

禁止atd服务2 3 4 5 模式下启动

[root@qqq init.d]# chkconfig --list atd
atd             0:off   1:off   2:off   3:off   4:off   5:off   6:off

新写了个testsrv,加入SysV

chkconfig --add testsrv

删除应该是del

上一篇:6、shell-函数


下一篇:BGP的选路原则