起動スクリプトは、pid ファイルに関係なく複数回実行できます。

起動スクリプトは、pid ファイルに関係なく複数回実行できます。

このスクリプトを実行する理由は、 supervisord をデーモン化するためです。現在、私は または/etcコマンドにアクセスできないクラウド ホストにいますsudo。このスクリプトは、 からすべてを実行するための最善の試みです/home。 コマンドを含むこの bash スクリプトがありますstart-stop-daemonが、これを複数回実行できます。これを 1 回だけ実行できるようにしたいと考えています。これまでのところ、次の結果が得られました。

#! /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 ファイルが作成されると、以前のファイルが上書きされるので、複数回停止しても機能しないと思います。このスクリプトを 1 回だけ実行し、「script start」を 5 回実行しても複数のプロセスが実行されないようにするにはどうすればよいでしょうか。プロセスがすでに実行中であるというエラーが表示されるはずです。

答え1

何が問題だったのかがわかりました。私のスクリプトはプロセスがすでに実行されているかどうかを確認しなかったので、実行したプロセスと同じ数のプロセスを開始しただけで、次のコードが追加されました。

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

私の問題はstart)解決しました。これは supervisord がそれぞれの .pid ファイルを生成したかどうかを確認し、存在する場合は何もしません。

関連情報