init.d 在重启时未执行停止命令

init.d 在重启时未执行停止命令

我有一个 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

相关内容