
Причина, по которой я делаю этот скрипт, заключается в том, что я хочу демонизировать 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, и если он существует, то ничего не делает.