2021-05-12 14:32:11
設定程式成為Linux服務
最近寫了個程式需要隨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
相關文章