尽管存在 pid 文件,启动脚本仍可运行多次

尽管存在 pid 文件,启动脚本仍可运行多次

我执行此脚本的原因是我想将 Supervisord 守护进程化:现在我在云主机中,无法访问/etcsudo命令;此脚本是我尽最大努力从我的 执行所有操作/home。我有这个带有start-stop-daemon命令的 bash 脚本,但它允许我多次运行它,而我希望它只运行一次。到目前为止,我得到的结果如下:

#! /bin/bash 
SUPERVISORD=/usr/local/bin/supervisord
PIDFILE=/home/user/supervisor/supervisord.pid
OPTS="-c /home/user/supervisor/supervisord.conf -j $PIDFILE"

test -x $SUPERVISORD || exit 0

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin"

case "$1" in
start)
    log_begin_msg "Starting Supervisor daemon manager..."
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

stop)
    log_begin_msg "Stopping Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || log_end_msg 1
    log_end_msg 0
    ;;

restart|reload|force-reload)
    log_begin_msg "Restarting Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

*)
    log_success_msg "Usage: {start|stop|reload|force-reload|restart}"
    exit 1
    ;;
esac

exit 0

我假设创建 pid 文件时它会覆盖前一个文件,因此多次停止也不起作用。如果我执行“脚本启动”5 次,我怎样才能让此脚本只运行一次而不运行多个进程?它应该抱怨说该进程已在运行。

答案1

我发现了问题所在,我的脚本没有验证该进程是否已经在运行,所以它只是启动了尽可能多的进程,但是添加:

    if [ -f $PIDFILE ]; then
      echo "supervisord already running: $PIDFILE" 
      exit 1 
    fi

在这种start)情况下解决了我的问题,这将验证supervisord是否已生成其各自的.pid文件,如果存在则不执行任何操作。

相关内容