我有一个 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 将其设置为这样做。
但是,如果我启动脚本,然后重新启动服务器,stop 命令似乎不会执行,因为当服务器重新启动时,旧的 /tmp/sd-agent.pid 文件仍然存在。这会阻止 start 命令执行,因为它会检查 PID 文件是否存在,如果已经存在,它将不会启动。
当我发出重启命令时,似乎停止命令没有被执行,尽管直接调用它可以正常工作。
关于原因,有什么建议吗?
这是在 CentOS 5.2 上。
答案1
通常,PID 文件由 init 脚本本身处理。如果是 python 脚本来清理它,您也应该包含该代码...
您确定它是旧的 pid 文件,而不是新创建的文件,并且守护进程在启动时崩溃了吗?建议根据文件系统层次结构标准在启动期间清除 /tmp,请参阅该文件的这一部分—— 不确定这是否发生在 CentOS 中,但我认为它发生了。
更新: tmpwatch由 cron 调用(每天),并根据 atime(默认)定期清理 /tmp,因此您实际上应该将它们放在 /var/run 中,否则它们可能会被删除。
因此,我首先将 pid 文件移动到 /var/run,然后将清理工作放在 init 脚本中,然后从那里开始。
答案2
可能您的服务已正确启动但未正确停止。
审查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