背景:Shell脚本是linux运维人员必备利器,怎么样把shell脚本安装成服务且加入系统启动,然后就可以使用服务来管理,这是一个很重要的问题。


当我们运行安装服务的命令时候,假设服务名为myservice

#chkconfig --add myservice

常常会出现

service myservice does not support chkconfig



下面讲解正确方法:



1.1给服务脚本添加注释。


#vim /etc/init.d/myservice

添加下面两句到 #!/bin/bash 之后。

# chkconfig: 2345 10 90 
# description: myservice ....

第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺
省不在任何运行级启动,那么使用 - 代替运行级。第二行对服务进行描述,可以
用\ 跨行注释。

其中2345是默认启动级别,级别有0-6共7个级别。

  等级0表示:表示关机   

  等级1表示:单用户模式   

  等级2表示:无网络连接的多用户命令行模式   

  等级3表示:有网络连接的多用户命令行模式   

  等级4表示:不可用   

  等级5表示:带图形界面的多用户模式   

  等级6表示:重新启动

10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。


1.2  服务脚本必须存放在/etc/ini.d/目录下;

1.3 chkconfig --add servicename
    在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
    
1.4 chkconfig --level 2345 servicename on      修改服务的默认启动等级。




二、 另外还要注意几个问题:


1)启动脚本的标准结构:


case "$1" in
    start)
        do start-thing;
        ;;
    stop)
        do stop-thing;
        ;;
    restart)
        do restart-thing;
        ;;
    ...
esac

你如果按这种结构写个启动脚本测试一下就会发现,若该脚本的软连接以S开头,则系统启动的时候
执行start-thing代码段,若该脚本的软连接以K开头的话,则系统启动时执行stop-thing代码段
(有一点儿例外的是运行级别0,因为0级别是关闭系统,所以/etc/rc0.d/下的以S开头的软连接
也执行stop-thing段)。是不是很智能化,所以如果可以的话启动脚本最好写标准一些。如果你非
写成普通的脚本,就几个命令,没有上面那个结构,建立以K或S开头的软连接会怎么执行呢?
答案是全部执行。



2)chkconfig

 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

 

使用语法:

chkconfig [--add][--del][--list][系统服务] chkconfig[--level <等级代号>][系统服务][on/off/reset]

chkconfig在没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否 在当前运行级启动。如果是,返回true,否则返回false。如果在服务名后面指定了onoff或者reset,那么chkconfig 会改变指定服务的启动信息。onoff分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。onoff关,系统默认只对运行级345有效,但是reset可以对所有运行级有效。

 

使用范例:

chkconfig --list        #列出所有的系统服务

chkconfig --add httpd     #增加httpd服务

chkconfig --del httpd     #删除httpd服务

chkconfig --level httpd 2345 on #设置httpd在运行级别为2345的情况下都是on(开启)的状态

chkconfig --list        #列出系统所有的服务启动情况

chkconfig --list mysqld     #列出mysqld服务设置情况

chkconfig --level 35 mysqld on #设定mysqld在等级35为开机运行服务,--level35表示操作只在等级35执行,on表示启动,off表示关闭

chkconfig mysqld on     #设定mysqld在各等级为on,“各等级”包括2345等级

 

/etc目录下有一组rc开头目录,它们用来存放在各个运行级别下linux自动启动的服务:

/etc/rc0.d/ #运行模式0下需要启动的服务

/etc/rc1.d/ #运行模式1下需要启动的服务

/etc/rc2.d/ #运行模式2下需要启动的服务

/etc/rc3.d/ #运行模式3下需要启动的服务

/etc/rc4.d/ #运行模式4下需要启动的服务

/etc/rc5.d/ #运行模式5下需要启动的服务

/etc/rc6.d/ #运行模式6下需要启动的服务

这些目录中除README说明文档之外放的都是些软链接(符号链接),这些链接指向各服务的进程管理脚本,而这些进程管理脚本都放在/etc/init.d目录中.

 

  用chkconfig命令操作的添加或者删除开机自动启动服务程序,其实就是创建或删除这些目录中的软链接. 每个软链接的命名都是"大写S+运行顺序+脚本名称",里面有一个链接是"S20rc.local -> ../init.d/rc.local".打开它指向的脚本/etc/init.d/rc.local看一下,发现它里面调用了/etc/rc.local这个脚本.原来/etc/rc.local中的命令是在这儿执行的.

  如果把mysql服务的启动命令放进/etc/rc.local,操作系统也会在执行这个列表的时候执行它,不过它的执行顺序是20,比排在前面的S17mysql还要晚一些~

chconfig --level 2345 puppet off 等价于 chkconfig puppet off (不用--level 指定级别时,默认是2345

这条命令是设置 puppet 服务在 2345级别不自动启动,当执行这条命令时,会在

rc2.d rc3.d rc4.d rc5.d 这几个目录新建软连接K02puppet /etc/rc.d/init/puppet 脚本

chkconfig puppet on 这个就是在2345级别时,开机自动启动

当执行这条命令时,会在

rc2.d rc3.d rc4.d rc5.d 这几个目录新建软连接S98puppet /etc/rc.d/init/puppet 脚本

那这个 K02puppet S98puppet 中的 02 98 是怎么来的?

打开/etc/rc.d/init.d/puppet这个脚本文件,看前几行 如下:

 

#!/bin/bash

# puppet        Init script for running the puppetclient daemon

#

# Author:       Duane Griffin

#               David Lutterkort

#

# chkconfig: - 98 02

#

# description: Enables periodic systemconfiguration checks through puppet.

# processname: puppet

# config: /etc/sysconfig/puppet

特别是这行

# chkconfig: - 98 02

chkconfig 命令会读取这一行,来获取运行级别和那2个数字的,在这个脚本里面