Linux

init.d 重新啟動時不執行停止命令

  • November 6, 2010

我有一個 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 並將清理它的工作放在初始化腳本中,然後從那裡開始。

引用自:https://serverfault.com/questions/49271