Linux
init.d 重新啟動時不執行停止命令
我有一個 init.d 腳本來啟動 Python 腳本:
#!/bin/sh # ############################################################################### # sd-agent # # Written by Boxed Ice <customer.service@boxedice.com> # A server monitoring daemon for www.serverdensity.com # # Licensed under Simplified BSD License (see LICENSE) # ############################################################################### # # chkconfig: 345 85 15 # description: Server Density Monitoring Agent AGENTPATH="/usr/bin/sd-agent/agent.py" [ -f $AGENTPATH ] || echo "/usr/bin/sd-agent not found" # Source function library. if [ -f /etc/init.d/functions ]; then . /etc/init.d/functions fi if [ -f /etc/SuSE-release ]; then . /etc/rc.status rc_reset fi # Action to take case "$1" in start) python $AGENTPATH start if [ -f /etc/SuSE-release ]; then rc_status -v elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then echo " Started" else success echo fi echo ;; stop) python $AGENTPATH stop if [ -f /etc/SuSE-release ]; then rc_status -v elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then echo " Stopped" else success echo fi echo ;; restart) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/sd-agent start|stop|restart" exit 1 esac exit 0
這已“安裝”到 chkconfig 中:
[root@test ~]# chkconfig --list sd-agent sd-agent 0:off 1:off 2:off 3:on 4:on 5:on 6:off
如果我執行:
service sd-agent start
然後腳本按預期執行。Python 程式碼按預期在 /tmp/sd-agent.pid 處創建一個 PID 文件。同樣,如果我執行
service sd-agent stop
然後腳本終止並刪除 PID 文件。
如果我停止腳本然後重新啟動伺服器,它會在伺服器完成啟動週期時啟動。這是意料之中的,因為我已將其設置為使用 chkconfig 執行此操作。
但是,如果我啟動腳本,然後重新啟動伺服器,停止命令似乎不會執行,因為當伺服器恢復時,舊的 /tmp/sd-agent.pid 文件仍然存在。這會阻止啟動命令執行,因為它會檢查 PID 文件是否存在,如果已經存在則不會啟動。
當我發出重新啟動命令時,似乎沒有執行停止命令,即使直接呼叫它也可以正常工作。
關於為什麼的任何建議?
這是在 CentOS 5.2 上。
通常 PID 文件由 init 腳本本身處理。如果是清理它的python腳本,你也應該包括那個程式碼……
您確定它是舊的 pid 文件,而不是新創建的,並且守護程序只是在啟動時崩潰?/tmp 建議根據文件系統層次標准在引導期間清除,請參閱該文件的這一部分——不確定這是否發生在 CentOS 中,但我認為它確實發生了。
更新: tmpwatch由 cron(每天)呼叫,並根據 atime(預設)定期清理 /tmp,所以你真的應該把它們放在 /var/run 中,否則它們可能會從你下面被刪除。
所以我首先將 pid 文件移動到 /var/run 並將清理它的工作放在初始化腳本中,然後從那裡開始。