在sysV风格的init系统中,以Centos 6.x为例,系统服务脚本一般在/etc/rc.d/init.d目录下,每个支持sysV init的脚本,一般都可以接受如下参数:

    start|stop|restart|status   //这就是我们在centos下常用的控制服务启动与停止的参数。

并且,在sysV init脚本中都会在注释中有这么一行

#chkconfig:runlevel SS KK

wKioL1lDlMXCuSMdAABHU7NtISA490.png        

因为在sysV init系统中,使用chkconfig进行服务的开机自启动管理以及各运行级别切换时要运行服务的管理。而chkconfig:runlevel SS KK就是chkconfig程序管理该脚本启动或者停止的依据,虽然它是注释的,但是chkconfig会扫描并读取它。


       

参照上一篇帖子,在系统启动和服务等级发生变化时,是由/etc/rc.d/rc针对不同等级下rc#.d目录中的脚本进行启动和停止。所以,我们虽然可以手动将脚本按照命名规则放到指定的rc#.d目录下,然后由rc在切换时执行,但是这样总归是操作太过复杂,linux的哲学思想就是,能不动手就不动手。。。

那么chkconfig就可以替代人工方式来进行自动的为服务脚本在指定的rc#.d下创建软链接,然后由rc控制以达到自动运行和停止的目的。


       

回过头来说各个字段的意义:
       

当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels区域的运行等级表示默认创建为S*开头的链接,此外未指定的运行级别都默认创建为K*开头的链接。S后面的优先级为SS所表示的数字,K后面的关闭优先级为KK所表示的数字;

    一般SS+KK=99,并不是限制性的。而是透出一种规律,先开启的服务后关闭,后开启的服务先关闭。因为先开启的服务可能被其他服务所依赖,后开启的服务可能依赖其他服务。(KK值最好为00,因为在0和6运行等级中,KK01就是关闭或者重启动作了)

    如果runleves区域为-,说明没有默认为S开头的链接,所有都是K的。

chkconfig的用法:
--list:列出所有目前chkconfig所能管控的服务。
--list 服务名:只显示指定服务的启动规则。
--add 服务名:将制定服务加入管控,也就是给服务在rc#.d下创建软链接。
--del 服务名:移除对指定服务的管控,也就是将服务在rc#.d下的软链接删除。
--level 运行级别 服务名 [on|off]:精细控制,指定服务在指定级别下是否自启动。如果不加--level 运行级别,则默认操作2345级别。
       


       

了解了这些,就可以尝试自己编写一个脚本,放到/etc/rc.d/init.d目录下,然后将其加入chkconfig控制,在指定级别下进行启动或者停止。

例如,写一个脚本名字叫做myservice

#!/bin/bash
#chkconfig:2345 77 22
case $1 in
start)
echo "Starting...";;
stop)
echo "Stopping...";;
restart)
echo "Restarting...";;
status)
echo "I don't know";;
*)
echo "please use start|stop|restart|status";;
esac
       

wKiom1lDlbGyViwcAAAIxLHX6QQ512.png        

使用chkconfig 将其加入控制,所谓加入控制就是按照脚本中chkconfig指定的信息在rc#.d下创建软链接。

chkconfig --add myservice
       

查看一下rc#.d目录下,可以看到已经存在了创建好的软链接,这样级别切换时就可以正常启动或者停止了。

wKioL1lDlb-AjMwPAAAa4_vwZ3Q912.png        


       

为什么将开机启动项写入/etc/rc.local中,就可以在开机的时候自动执行呢?原因还是藏在/etc/rc.d/rc#.d中,

wKiom1lEjLrwg7UmAAAnGftX9Kk733.png        

因为2345运行等级的最后一个启动脚本,就是rc.local的软链接。


       


       

这一类,可以控制自己在不同运行等级下停止或启动的被称之为独立运行服务。