🌚

怎样为红帽系Linux发行版写系统服务脚本

Posted at — Jun 19, 2012
#Linux #Redhat #CentOS #Bash #编程

##阅读说明

阅读本文要求有基本的Linux系统使用经验和Bash脚本编程能力。

本文所述的内容适用于RHEL、CentOS等红帽系Linux发行版。

##系统服务简介

###常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 启动MySQL
service mysqld start

# 关闭MySQL
service mysqld stop

# 重启MySQL
service mysqld restart

# 查看MySQL服务运行状态
service mysqld status

# 查看MySQL服务是否开机自动运行
chkconfig --list mysqld

# 设置MySQL服务开机自动运行
chkconfig --level 345 mysqld on

# 取消MySQL服务开机自动运行
chkconfig --level 345 mysqld off

###运行级别

泛UNIX派系操作系统使用运行级别标识使用何种模式初始化。理论上,不同的发行版各级别代表的意义不同。红帽系发行版使用以下七个运行级别:

最常用的是0、3、5、6四种模式。其中,0和6表示关闭和重启操作系统,所以,执行命令init 0shutdown是一个效果,同样,执行命令init 6reboot是一个效果。模式3即普通的命令行用户界面,模式5即普通的图形界面用户界面。

模式1在个别情景下会用到,例如忘记root用户的密码时,需要进入模式1修改密码。

##系统服务脚本格式

###示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

# chkconfig: 345 99 12
# description: This is a sample service script

case "$1" in
    start)
        # Start something.
        touch /var/lock/subsys/sample
        ;;
    stop)
        # Stop something.
        /bin/rm -f /var/lock/subsys/sample
        ;;
    restart|reload)
        # Restart something.
        ;;
    status)
        # Report the running status of something.
        ;;
    *)
        # Invalid command, complain an error.
        ;;
esac

exit 0

###解释

假设本服务脚本文件的文件名为sample

整个服务脚本是一个普通的Bash脚本。主体是一个case语句,定义了四个命令start、stop、restart或reload、status,顾名思义,四个命令分别用来启动、停止、重启该服务,以及获取服务的运行状态。

红帽系发行版使用chkconfig命令设置服务自动在哪个运行级别被自动执行。要使服务脚本支持chkconfig命令,需要加入注释行:

1
# chkconfig: 345 99 12

其中,345表示缺省的运行级别,使用如下命令添加服务时:

1
chkconfig --add sample

将和使用如下命令一个效果:

1
chkconfig --level 345 sample on

99表示启动序号,例如若希望服务B在服务A启动后启动,且服务A的启动序号是98,则服务B的启动序号应设为大于98的一个整数。

12表示停止序号,作用与启动序号相同。

此外,若希望在操作系统关闭前先自动执行服务的关闭命令,需要在**/var/lock/subsys/目录中存在与服务名同名的空文件,因此,应在start命令中创建一个这样的文件,并在stop**命令中删除之。