基于case分支编写服务脚本

版权声明:苏苏吖 https://blog.csdn.net/weixin_44774638/article/details/91489451
问题
本案例要求编写myprog服务脚本,相关要求如下:
能支持start、stop、restart等控制参数
控制参数通过位置变量$1传入
能通过chkconfig命令来管理此服务
服务操作为sleep进程的开启/关闭/重启
方案
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。
case分支的语法结构如下所示:
case  变量值  in
模式1)
    命令序列1 ;;
模式2)
    命令序列2 ;;
    .. ..
*)
    默认命令序列
Esac
Linux系统的服务脚本默认均位于/etc/init.d/目录下,基本上都采用了case分支结构来识别控制参数。能够执行“/etc/init.d/服务名 start”或“service 服务名 start”来启动对应的服务,是因为对应的脚本文件能够处理“start”这个位置参数。
以network服务脚本为例,可以看一下它的case结构是怎样的(此处暂忽略其它无关语句):
[root@svr5 ~]# vim /etc/init.d/network
#! /bin/bash
#
# network       Bring up/down networking
#
# chkconfig: 2345 10 90  				//管理参数(自启的运行级别 开启顺序 关闭顺序)
# description: Activates/Deactivates all network interfaces configured to \
#              start at boot time.    	//服务描述
.. ..
case "$1" in  						//检查执行时的第1个位置参数
  start)  							//若参数是“start”,启用各种网络设备及相关进程
        .. ..  						//一系列启用操作
        ;;
  stop)  								//若参数是“stop”,停用各种网络设备及相关进程
        .. ..  						//一系列停用操作
        ;;
  status)  							//若参数是“status”,报告网络接口状态
        echo $"Configured devices:"
        echo lo $interfaces
        echo $"Currently active devices:"
        echo $(/sbin/ip -o link show up | awk -F ": " '{ print $2 }')
        ;;
  restart|reload)  				//若参数是“restart”或“reload”,重启网络
        cd "$CWD"
        $0 stop  					//调用本脚本,通过stop参数先停止服务
        $0 start  					//调用本脚本,通过start参数再启用服务
        ;;
  *)  							//若参数无法识别,则给出正确的用法帮助,并退出脚本
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac
比如,当尝试给network脚本提供check参数时,会提示正确的用法:
[root@svr5 ~]# /etc/init.d/network check
Usage:/etc/init.d/network {start|stop|restart|reload|status}
或者
[root@svr5 ~]# service network check
Usage:/etc/init.d/network {start|stop|restart|reload|status}
步骤
实现此案例需要按照如下步骤进行。

步骤一:任务需求及思路分析

要将myprog作为系统服务,应该将脚本复制到/etc/init.d/目录下。若希望通过chkconfig来进行管理,还需要在脚本开头添加chkconfig管理参数、服务描述。
服务脚本通过case分支检查位置参数 $1 ,根据参数的不同取值做不同操作。
响应start的操作是启用一个sleep进程(只是测试嘛,就别加太复杂的语句啦),比如sleep 7200 &可在后台睡眠2小时。
响应stop的操作可简单使用pkill等命令杀死已启用的sleep进程。
响应status的操作(可选)则可通过pgrep等命令来检索sleep进程、报告结果。
响应restart的操作则依次调用前面的stop、start即可。
对于其他未知参数,一律提示正确用法。
步骤二:根据实现思路编写脚本文件
脚本编写参考如下,其中echo命令的-n选项表示不输出末尾的换行符:

[root@svr5 ~]# vim /etc/init.d/myprog
#!/bin/bash
# chkconfig: 2345 90 10
# description: Startup script for sleep Server. (for Test only)

case "$1" in
start)
    echo -n "正在启动sleep服务 ... "
        if sleep 7200 &  						//启动sleep进程,若成功则显示OK
        then
            echo "OK"
        fi
        ;;
stop)
    echo -n "正在停止sleep服务 ... "
        pkill "sleep" &> /dev/null && echo "OK"  	//结束sleep进程
        ;;
status)
    if pgrep "sleep" &>/dev/null  				//检查sleep进程状态,报告结果
        then
            echo "sleep服务已经启动。"
    else
        echo "sleep服务已经停止。"
        fi
        ;;
restart)
        $0 stop  								//先停止本服务
        $0 start  								//再启动本服务
        ;;
*)  											//默认输出脚本用法
    echo "用法: $0 {start|stop|status|restart}"
    exit 1
esac

[root@svr5 ~]# chmod +x /etc/init.d/myprog

步骤三:验证、测试脚本

未提供参数,或提供的参数无法识别时,提示正确用法:

[root@svr5 ~]# /etc/init.d/myprog
用法: /etc/init.d/myprog {start|stop|status|restart}
[root@svr5 ~]# /etc/init.d/myprog check
用法: /etc/init.d/myprog {start|stop|status|restart}
通过service调用的效果也是相同的:
[root@svr5 ~]# service myprog check
用法: /etc/init.d/myprog {start|stop|status|restart}
确认可响应status控制参数:
[root@svr5 ~]# service myprog status
sleep服务已经停止。
确认可响应start控制参数,再次检查服务状态:
[root@svr5 ~]# service myprog start
正在启动sleep服务 ... OK
[root@svr5 ~]# service myprog status
sleep服务已经启动。
确认可响应stop控制参数,再次检查服务状态:
[root@svr5 ~]# service myprog stop
正在停止sleep服务 ... OK
[root@svr5 ~]# service myprog status
sleep服务已经停止。
重新启动myprog服务,再确认可响应restart控制参数:
[root@svr5 ~]# service myprog start
正在启动sleep服务 ... OK
[root@svr5 ~]# service myprog restart
正在停止sleep服务 ... OK
正在启动sleep服务 ... OK
上述操作完成后,说明此服务脚本基本上可以使用了。
步骤四:添加myprog服务
通过将服务提交给chkconfig管理,方便配置在不同运行级别是否自动运行。
仅仅将脚本文件复制到/etc/init.d/目录下,通过chkconfig工具是看不到的,但如果脚本中配置了管理参数,则会在--list时给出相应提示:
[root@svr5 ~]# chkconfig --list myprog
myprog 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig --add myprog”)
执行以下操作将myprog添加为系统服务,并再次检查自启状态:
[root@svr5 ~]# chkconfig --add myprog  				//添加myprog服务
[root@svr5 ~]# chkconfig --list myprog  			//确认添加结果
myprog          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
此后,就可以使用chkconfig工具来调整myprog服务的自启状态了。比如,以下操作可以将所有自启关闭:
[root@svr5 ~]# chkconfig myprog off  				//将自启设为关闭
[root@svr5 ~]# chkconfig --list myprog  			//确认设置结果
myprog          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

猜你喜欢

转载自blog.csdn.net/weixin_44774638/article/details/91489451