centOS 6 服务管理与服务脚本
服务管理与服务脚本
linux服务
服务启动过程详解
在开机启动过程中,我们计算机的各种服务也会按照配置信息启动服务,那个我们的服务使如何启动的呢?我们以 init 3
模式为例,进行说明:
上图中:rc 3 --> 意味着读取/etc/rc.d/rc3.d/下的内容,现在我们看看/etc/rc.d/rc3.d/下有什么东西。
在/etc/rc.d/rc3.d/目录下,我们看到全部都是软链接连接到/init.d/下的脚本。
我们可以通过脚本加状态的模式启用或关闭我们的某个服务:
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
但是实际上它并不是按照数字排序的,而是按照字符串的大小排序的。
K开头的服务代表开机不启动
S开头的服务代表开机启动
所以我们在写服务脚本的时候,如果是依赖于某些服务的,我们最好能够将我们的脚本连接名排到我们的服务所依赖的服务软连接后面。
我们看一下,在启动计算机的过程中,init加载了一个脚本/etc/rc.d/rc,下面是这个脚本的一部分内容。
# First, run the KILL scripts. for i in/etc/rc$runlevel.d/K*;do # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/K??} [-f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]||continue check_runlevel "$i"||continue # Bring the subsystem down. [-n "$UPSTART"]&& initctl emit --quiet stopping JOB=$subsys $i stop [-n "$UPSTART"]&& initctl emit --quiet stopped JOB=$subsys done # Now run the START scripts. for i in/etc/rc$runlevel.d/S*;do # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/S??} [-f /var/lock/subsys/$subsys ]&&continue [-f /var/lock/subsys/$subsys.init ]&&continue check_runlevel "$i"||continue # If we're in confirmation mode, get user confirmation if["$do_confirm"="yes"];then confirm $subsys rc=$? if["$rc"="1"];then continue elif["$rc"="2"];then do_confirm="no" fi fi update_boot_stage "$subsys" # Bring the subsystem up. [-n "$UPSTART"]&& initctl emit --quiet starting JOB=$subsys if["$subsys"="halt"-o "$subsys"="reboot"];then export LC_ALL=C exec $i start fi $i start [-n "$UPSTART"]&& initctl emit --quiet started JOB=$subsys done
在上面的脚本中我们发现,计算机在启动服务过程中,会在对应的运行级别下,先关闭一部分服务,关闭玩服务之后才会再对应的运行级别下启动一些服务。
所以面图片中带有K开头的软链接程序,就相当于执行真正指向的脚本后面跟上stop,带有S开头的软链接程序,就相当于执行真正指向的脚本后面跟上start。
我们以autofs为例,作以说明:
[root@CT691 ~]#/etc/rc.d/init.d/autofs start
Starting automount: automount: program is already running.
[ OK ]
上述的效果其实和service autofs
本质上是一样的:
[root@CT691 ~]#service autofs start
Starting automount: automount: program is already running.
[ OK ]
接下来,我们以一个简单的服务脚本为例,做一个简单的说明演示:
脚本:
#!/bin/bash source /etc/rc.d/init.d/functions if[ $1 !="stop"]&&[ $1 !="start"]&&[ $1 !="restart"]&&[ $1 !="status"];then echo "The parameter must be start,stop,restart,status" exit; fi if[ $1 ="start"];then if[-e /var/lock/subsys/$(basename $0)];then action "the `basename $0` has started!" false else touch /var/lock/subsys/$0 action "the ` basename $0` start success" true fi elif[ $1 ="stop"];then if[-e /var/lock/subsys/$(basename $0)];then rm -rf /var/lock/subsys/$(basename $0) action "the `basename $0` has stopped!" true else action "the`basename $0` is not starting" false fi elif[ $1 ="restart"];then if[-e /var/lock/subsys/$(basename $0)];then rm -rf /var/lock/subsys/$(basename $0) action "the `basename $0` has stopped!" true touch /var/lock/subsys/$0 action "the ` basename $0` restart success" true else action "the`basename $0` is not starting" false action "the`basename $0` is not starting" false fi elif[ $1 ="status"];then if[-e /var/lock/subsys/$(basename $0)];then echo -e "the \033[1;32;1m`basename $0`\033[0m is running" else echo -e "the \033[1;31;1m`basename $0`\033[0m has stopped!" fi fi
接下来,我们将这个脚本放到/etc/rc.d/init.d/中去,先试一下看是否有什么问题:
我们使用service试试:一样可以使用
现在这个脚本并不是开机就能运行的,我们将它做成服务,还需要进行一些改变。在linux上,有一个工具控制着计算机服务的开机是否运行:ntsysv命令
如下图所示,带星好的就是开机运行的服务,不带星号的就是开机不运行的服务
chkconfig命令
这个工具有一个不好的地方就是它只能改本模式下的服务的开机是否启动,不能改变其他模式下服务的开机启动,如果我想改5模式的,需要使用ntsysv --level=5
,如果我们想改各个模式下的开机服务,如果使用这个方法一个一个该改,十分的不方便,所以,我们使用chkconfig命令:
我们可以使用这个命令看到各个模式下的服务是否开启或关闭,我以上图的第一个服务为例,关闭在3,5模式下的开机服务,看看如何实现:
关闭成功。
更多的时候,我们会使用chkconfig NetworkManager on
或chkconfig NetworkManager off
,这种方式默认启用或关闭2345模式下的服务。
接下来我们使用chkconfig NetworkManager on
开启服务,既然我们将服务就开启了,那么在/etc/rc3.d/下面肯定有一个以S开头的相关服务这就意味着它开机就能启动。
接下来,我们做一个小实验:
- 查看atd服务是否开启,若开启,关闭
- 删除掉/etc/rc3.d/下atd的软链接
- 创建一个数值靠后,并且是S开头的软链接
- chkconfig查看atd服务状态
我们看到,当我们创建一个S开头的软链接之后,它的开机服务状态就变成了on了。
接下来我们将刚才的testsrv.sh做成我们的服务脚本,要做服务脚本,还需要一点点的改动,我们需要在注释中加上一行#chkconfig: 35 96 03
35
代表的含义是在3和5模式下开机启动,96
代表S开头的编号,03
代表K开头的编号。
现在还是没有服务启动的的,我们需要手动加上去:
现在,在3模式下他已经是可以开机启动的服务了,我们也可以现在手动改成在3模式下开机不启动的状态,我们只需要chkconfig --level 3 testsrv.sh off
:
[root@CT691 init.d]#chkconfig --list testsrv.sh testsrv.sh 0:off 1:off 2:off 3:on 4:off 5:on 6:off [root@CT691 init.d]#chkconfig --level 3 testsrv.sh off [root@CT691 init.d]#ls /etc/rc3.d/K03* /etc/rc3.d/K03testsrv.sh
如果我们不想要这个服务,我们需要将这个服务给删除,删除的方法是:chkconfig --del testsrv.sh
,删除服务后,文件并不会被删除,但是软链接会被删除。chkconfig --list
也不能查询到。
非独立服务与xinetd进程
很多时候,一些服务我们平时用不到,有时候一年才用一次或者好几个月用一次,如果让该服务开机就跑起来就太过于浪费资源。我们需要再使用它的时候自动开启,这该如何实现呢?
我们上面的一个一个的服务就做独立服务,而非独立服务是有特定的服务进行代理监听端口,等等有访问时由特定服务通知该服务启动运行,这个特定的服务就是xinetd,我们也可以称它是超级守护进程。
Telnet服务就是一个非独立服务,它的使用需要依赖于xinetd,当我们使用yum安装该软件时,它会自动安装上xinetd,下面是我安装好的Telnet:
接下来我们启动该服务,在第一次安装后,首先启动xinetd,在启动telnet:
我们在启动服务后可以看看是谁在监听这着23端口:
接下来我们尝试使用Telnet连接该系统,然后再次查看是谁在监听端口:
当我们开始使用的时候,他就变成了由原服务来执行,这就是我们要说的非独立服务。
一个特殊的服务脚本
正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
- /etc/rc.d/rc.local在指定运行级别脚本后运行
- 可以根据情况,进行自定义修改