Linux進程托管與守護進程設置


引言

在上一篇《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

                  Linux Daemon Writing HOWTO

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM