引言
在上一篇《Linux啟動之旅》中,我們了解了Linux啟動過程,在該過程的最后一步,init進程拉起/etc/init.d/rcN.d/目錄下指定的守護進程(daemon)。假若自定義的一個進程也需要隨開機自啟動,並隨系統一直運行,我們可以怎么設置呢?
利用init進行進程托管
系統啟動時,init程序根據/etc/inittab文件的配置,拉起系統服務、getty登陸終端,自定義的進程同樣也可交由init程序管理。
最簡單的方法,是在/etc/inittab文件中添加一條語句:
zz:2345:respawn:/tmp/lx/test_init
該語句含義為:
id: inittab文件中條目的唯一標識,這里為zz
runlevels: 列出指定命令或進程的運行級,這里指示/tmp/lx/test_init程序在2、3、4和5級別運行
action: 描述init對進程進行何種方式托管,respawn指該進程只要中止就立即重新啟動
process: 要執行的進程,這里為/tmp/lx/test_init
對/etc/inittab文件修改過后,我們可發送HUP信號量給init進程,讓修改生效:
#kill -HUP 1
以上命令執行完之后,就可以查到我們自定義的程序咯:
SER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3783 0.0 0.0 3832 600 ? Ss Mar27 0:00 /tmp/lx/test_init
init是否能像我們設定的那樣對自定義進程進行管理呢?kill掉以上進程再檢驗一下吧!
這種設定自啟動、長久執行進程的方式十分簡單,所要做的就是把程序准備好,再在/etc/inittab文件里添加一條語句即可。但是,如果要把進程停掉,我們需要這么做:修改/etc/inittab文件,在對應條目開頭加上注釋,然后發送SIGHUP信號讓init進程重新加載/etc/inittab配置文件。
這時,在一旁掃地的阿姨瞄了一眼屏幕,不經意地說:停止進程就這么不方便,假如我還要重啟進程、查詢進程狀態、修改進程運行級別呢?
守護進程設置
為更方便地對自定義進程進行起停、查詢等操作,我們可將自定義進程設置為守護進程,並利用service等工具進行進程管理工作。下面我們來看守護進程的設置方法。
首先,和系統自帶的守護進程一樣,在/etc/init.d目錄下需要有一個與自定義守護進程相對應的腳本文件(init script),該腳本包含以下內容。
說明信息(INIT INFO):
# /etc/init.d/test_daemon
### BEGIN INIT INFO
# Provides: test_daemon
# Required-Start: $local_fs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 1 2 6
# Description: test_daemon writes a message to /tmp/lx/test.log every 10 seconds,
# showing that the daemon is alive.
### END INIT INFO
守護進程的說明信息格式固定,其指明守護進程依賴的服務、啟動/關閉的運行級別等信息。
進程開啟(start)、退出(stop)、狀態查詢(status)等動作對應的腳本:
TEST_BIN=/usr/sbin/test_daemon
case "$1" in
start)
echo -n "Starting test_daemon "
/sbin/startproc $TEST_BIN
rc_status -v
;;
stop)
echo -n "Shutting down test_daemon "
/sbin/killproc -TERM $TEST_BIN
rc_status -v
;;
以上腳本調用了startproc、killproc工具對守護進程的起停進行控制。
最后,正確設置腳本權限,並使用insserv工具生成/etc/init.d/rcN.d目錄下相應鏈接:
#chmod 744 /etc/init.d/test_daemon
#insserv /etc/init.d/test_daemon
insserv工具會根據守護進程init script中"INIT INFO"的依賴信息,決定系統啟動時,自定義守護進程與已有守護進程的相對啟動順序:
#ll /etc/init.d/rc5.d/*test
lrwxrwxrwx 1 root root 7 Mar 29 01:02 /etc/init.d/rc5.d/K01test_daemon -> ../test_daemon
lrwxrwxrwx 1 root root 7 Mar 29 01:02 /etc/init.d/rc5.d/S01test_daemon -> ../test_daemon
完成以上步驟,在系統重啟后,進程test_daemon就會自動啟動。我們可以使用命令對該進程進行起停:
#/etc/init.d/test_daemon start
Starting test_daemon done
#/etc/init.d/test_daemon status
Checking for service test_daemon running
#/etc/init.d/test_daemon stop
Shutting down test_daemon done
service工具可對/etc/init.d目錄下的系統服務進行管理,也可以使用它完成與以上相同的操作:
#service test_daemon start
#service test_daemon status
#service test_daemon stop
另外,我們還可以使用chkconfig工具對test_daemon的啟動級別進行查詢和設定:
#chkconfig --list | grep test_daemon
test_daemon 0:off 1:off 2:on 3:on 4:off 5:on 6:off
#chkconfig test_daemon 35
#chkconfig --list | grep test
test 0:off 1:off 2:off 3:on 4:off 5:on 6:off
小結
本文介紹了兩種添加自定義后台進程的方法。將進程交由init托管,當進程退出時可被init重新拉起,設置方法簡單,但不方便對進程進行管理;以init script的方式將進程設置為系統服務項,利用系統已有的服務項管理工具service、chkconfig,能方便地對進程進行管理。
本文中使用的自定義進程代碼和相關腳本可從這里下載。
---
本文基於Suse11sp1(x86_64),該發行版可從這里下載。
#cat /etc/SuSE-release ;uname -r
SUSE Linux Enterprise Desktop 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1
2.6.32.12-0.7-default
Reference: Automatic startup of dsmcad daemon on system reboot on SUSE Linux
Creating a Persistent Daemon with init. Hack 4 in Chapter 1. Server Basics, Linux server hacks
Document /etc/init.d/README under Suse11sp1
Document /etc/init.d/skeleton under Suse11sp1