pid 파일에도 불구하고 시작 스크립트를 여러 번 실행할 수 있습니다.

pid 파일에도 불구하고 시작 스크립트를 여러 번 실행할 수 있습니다.

제가 이 스크립트를 작성하는 이유는 Supervisord를 데몬화하고 싶기 때문입니다. 현재 저는 /etc또는 sudo명령에 액세스할 수 없는 클라우드 호스트에 있습니다. 이 스크립트는 내 /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 파일을 생성했는지 확인하고 파일이 존재하는 경우 아무 작업도 수행하지 않습니다.

관련 정보