我有一个init.d脚本来启动一个Python脚本:
#!/bin/sh # ############################################################################### # sd-agent # # Written by Boxed Ice <[email protected]> # 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处创build一个PID文件。 同样,如果我执行
service sd-agent stop
那么该脚本被终止并且PID文件被移除。
如果我停止脚本,然后重新启动服务器,它将在服务器完成引导周期时启动。 这是预料之中,因为我已经把它设置为使用chkconfig来做到这一点。
但是,如果我启动脚本,然后重新启动服务器,stop命令似乎不会执行,因为当服务器恢复时,旧的/tmp/sd-agent.pid文件仍然存在。 这会阻止执行启动命令,因为它检查是否存在PID文件,如果已经存在,将不会启动。
看来,即使直接调用它,正在执行重新启动命令时停止命令没有被执行正常工作。
有什么build议,为什么?
这是在CentOS 5.2上。
通常,PID文件是由init脚本本身处理的。 如果它是清理它的Python脚本,你应该包括该代码以及…
你确定它是旧的PID文件,而不是一个新创build的,而且守护进程刚刚在启动时崩溃? / tmpbuild议根据文件系统层次结构标准在引导过程中清除,请参阅该文档的这一部分 – 不知道在CentOS中是否发生这种情况,我认为它做到了。
更新: tmpwatch被cron(每天)调用,并基于atime(默认)周期性地清理/ tmp,所以你真的应该把它们放在/ var / run中,否则它们可能会被删除。
所以我会先把pid文件移动到/ var / run,然后把它清理到init脚本中,然后从那里开始。
可能您的服务正常启动,但没有正确停止。
查看http://www.serverdensity.com/docs/agent/linuxstartup/并确保您有K个脚本以及S脚本; 您可能需要运行以下(从上面的页面复制):
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc0.d/K15sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc1.d/K15sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc2.d/K15sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc3.d/S85sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc4.d/S85sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc5.d/S85sd-agent ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc6.d/K15sd-agent