儘管有 pid 文件,啟動腳本仍可以運行多次

儘管有 pid 文件,啟動腳本仍可以運行多次

我做這個腳本的原因是因為我想守護supervisord:現在我在一個雲端主機中,我沒有權限存取/etcsudo命令;這個腳本是我從我的/home.我有這個帶有命令的 bash 腳本start-stop-daemon,但它允許我多次運行它,並且我希望它只運行一次。到目前為止,這是我得到的:

#! /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文件,如果存在,則不執行任何操作。

相關內容