Скрипт запуска может быть запущен несколько раз, несмотря на файл 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-файла он перезаписывает предыдущий, поэтому выполнение нескольких остановок также не работает. Как мне заставить этот скрипт запуститься один раз и не запускать несколько процессов, если я делаю "script start" 5 раз? Он должен жаловаться, что процесс уже запущен.

решение1

Я выяснил, в чем была проблема: мой скрипт не проверял, запущен ли уже процесс, поэтому он просто запускал столько процессов, сколько вы их запускали, но добавлял:

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

В start)случае решения моей проблемы это проверяет, сгенерировал ли supervisord соответствующий файл .pid, и если он существует, то ничего не делает.

Связанный контент