怎樣為紅帽系Linux發行版寫系統服務腳本

| Comments

閱讀說明

閱讀本文要求有基本的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:關機
  • 1:單用戶模式
  • 2:多用戶模式,無網絡服務
  • 3:多用戶模式,有網絡服務
  • 4:未使用/用戶自定義
  • 5:帶圖形界面的多用戶模式
  • 6:重啟

最常用的是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命令中刪除之。

Comments