背景: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。如果在服务名后面指定了on,off或者reset,那么chkconfig 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。
使用范例:
chkconfig --list #列出所有的系统服务
chkconfig --add httpd #增加httpd服务
chkconfig --del httpd #删除httpd服务
chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态
chkconfig --list #列出系统所有的服务启动情况
chkconfig --list mysqld #列出mysqld服务设置情况
chkconfig --level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,--level35表示操作只在等级3和5执行,on表示启动,off表示关闭
chkconfig mysqld on #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级
/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个数字的,在这个脚本里面
本文转自pizibaidu 51CTO博客,原文链接:http://blog.51cto.com/pizibaidu/1795909,如需转载请自行联系原作者