SHELL脚本testsrv脚本(init脚本或者SysV脚本)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:关
启动关闭玩玩
五、脚本详解
? 再说一下,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
以上是关于SHELL脚本testsrv脚本(init脚本或者SysV脚本)的主要内容,如果未能解决你的问题,请参考以下文章
怎么让Android系统或Android应用执行shell脚本