我有一个 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 处创建一个 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 并将清理它的工作放在初始化脚本中,然后从那里开始。
可能您的服务正常启动但没有正确停止。
查看http://www.serverdensity.com/docs/agent/linuxstartup/并确保您拥有 K 脚本和 S 脚本;您可能必须运行以下命令(从上面的页面复制):