首頁 > 軟體

設定程式成為Linux服務

2020-06-16 17:15:43

最近寫了個程式需要隨Linux啟動時自動執行起來, 查了一些方法後, 通過設定程式成為系統的服務實現了這個需求, 在此記錄一下.

測試程式

#! /bin/sh

while [ true ]
do
    echo "[`date +%Y%m%d-%H%M%S`]" >> /var/log/test_sh.log
    sleep 5
done

每5秒, 向/var/log/test_sh.log 輸出一個當前時間的字串, 儲存為test_sh

服務控制指令碼

通過此服務控制指令碼, 可以實現通過系統的service命令設定這個服務的start, stop, 以及執行status查詢狀態, 儲存為tstd. 服務控制指令碼後接d是一種慣例性的命名, 代表daemon.

#! /bin/sh

# chkconfig: 35 99 99
# descroption: service test script
# processname: test_sh


### BEGIN INIT INFO
# Provides:           tstd
# Required-Start:
# Should-Start: 
# Required-Stop: 
# Should-Stop: 
# Default-Start:      2 3 5
# Default-Stop:       0 1 2 6
# Description:        service test script 
#
### END INIT INFO

通過以上註釋, 可通過chkconfig或者insserv命令來安裝服務, 指定服務的在Linux的對應的執行等級中自啟動以及停止, 並設定啟動順序.

Linux執行等級:

  • 等級0表示:表示關機
  • 等級1表示:單使用者模式
  • 等級2表示:無網路連線的多使用者命令列模式
  • 等級3表示:有網路連線的多使用者命令列模式
  • 等級4表示:不可用
  • 等級5表示:帶圖形介面的多使用者模式
  • 等級6表示:重新啟動
TEST_BIN='/usr/sbin/test_sh'
source /etc/rc.status
test -x $TEST_BIN || exit 5

rc_reset

這一段在/usr/sbin/中檢查服務對應的指令碼程式是否存在, 並載入/etc/rc.status這個指令碼, rc.status指令碼中包含了rc_reset, rc_status, rc_failed, rc_reset, rc_exit等有用的命令, 可以通過接受上一條命令的結果, 在service命令執行時顯示出不同的效果.

case "$1" in
    start)
        echo "starting test daemon"
        startproc $TEST_BIN
        rc_status -v
        ;;
    
    stop)
        echo "stop test daemon"
        killproc $TEST_BIN
        rc_status -v
        ;;
        
    status)
        echo "stop test daemon"
        checkproc $TEST_BIN
        rc_status -v
        ;;
        
    *)
        echo "Usage: $0 { start | stop | status }"
        exit 1
        ;;
esac

startproc 預設通過程式的絕對路徑和/var/run/<basename>.pid 來檢索程式是否執行, 沒有檢索到時便以後台的方式來執行程式.

killproc則會通過通過向程式傳送SIGTERM來終止程式的執行, 若程式沒有響應, 還會依次傳送SIGHUP, 以及SIGKILL來刪除程式, 確認程式已關閉後嗎會刪除程式產生的PID檔案.

checkproc會檢查程式的狀態, 根據程式的狀態返回不同的值:

  • 0: 服務執行中
  • 1: 服務停止, 但是/var/run 下的pid檔案仍然存在
  • 2: 服務停止, 但是/var/lock 下的檔案仍然存在
  • 3: 服務沒有在執行

安裝指令碼

#! /bin/sh

ROOT_DIR=$(echo $(cd "$(dirname "$0")"; pwd))

echo $ROOT_DIR
service tstd stop > /dev/null 2>&1

install -m 750 ${ROOT_DIR}/test_sh /usr/sbin/
install -m 750 ${ROOT_DIR}/tstd /etc/init.d/

chkconfig -a tstd > /dev/null 2>&1
service tstd start > /dev/null 2>&1
echo -e "#!/bin/sh n service tstd start > /dev/null 2>&1" 
    > /etc/cron.hourly/tst_crontab

echo 'success'

安裝指令碼使用install命令來拷貝指令碼到指定目錄, 並設定對應的許可權. chkconfig命令可以將這個自定義的服務新增到設定的執行等級的自啟動中, 即在/etc/rc*.d中建立順序對應的符號連結.
最後在/etc/cron.hourly中建立了一個指令碼來每小時自動拉起一次服務, 防止服務意外終止掉. 還可以通過crontab來建立更精確的自動拉起間隔.

以上指令碼在SUSE下執行通過, 其他系統的部分命令不一樣, 但整體流程應該是差不多的.

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-05/143329.htm


IT145.com E-mail:sddin#qq.com