Подтвердить что ты не робот

Супервизор не может перезапустить половину времени

Я пытаюсь развернуть приложение Django с помощью Uwsgi и супервизора на машине под управлением Debian 8.1.

Когда я перезапускаю через sudo systemctl restart supervisor, он не может перезапустить половину времени.

$ [email protected]:/# systemctl start supervisor
    Job for supervisor.service failed. See 'systemctl status supervisor.service' and 'journalctl -xn' for details.
$ [email protected]:/# systemctl status supervisor.service
    ● supervisor.service - LSB: Start/stop supervisor
       Loaded: loaded (/etc/init.d/supervisor)
       Active: failed (Result: exit-code) since Wed 2015-09-23 11:12:01 UTC; 16s ago
      Process: 21505 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS)
      Process: 21511 ExecStart=/etc/init.d/supervisor start (code=exited, status=1/FAILURE)
    Sep 23 11:12:01 host supervisor[21511]: Starting supervisor:
    Sep 23 11:12:01 host systemd[1]: supervisor.service: control process exited, code=exited status=1
    Sep 23 11:12:01 host systemd[1]: Failed to start LSB: Start/stop supervisor.
    Sep 23 11:12:01 host systemd[1]: Unit supervisor.service entered failed state.

Однако в журналах supervisor или uwsgi ничего нет. Supervisor 3.0 работает с этой конфигурацией для uwsgi:

[program:uwsgi]
stopsignal=QUIT
command = uwsgi --ini uwsgi.ini
directory = /dir/
environment=ENVIRONMENT=STAGING
logfile-maxbytes = 300MB

stopsignal = QUIT добавлен, потому что UWSGI игнорирует сигнал по умолчанию (SIGTERM) на остановке и жестоко убивается, когда SIGKILL покидает сиротских рабочих.

Есть ли способ узнать, что происходит?

EDIT:

Пробовал, как посоветовал mnencia: /etc/init.d/supervisor stop && while /etc/init.d/supervisor status ; do sleep 1; done && /etc/init.d/supervisor start но он все равно не работает в течение половины времени.

 [email protected]:~# /etc/init.d/supervisor stop && while /etc/init.d/supervisor status ; do sleep 1; done && /etc/init.d/supervisor start
    [ ok ] Stopping supervisor (via systemctl): supervisor.service.
    ● supervisor.service - LSB: Start/stop supervisor
       Loaded: loaded (/etc/init.d/supervisor)
       Active: inactive (dead) since Tue 2015-11-24 13:04:32 UTC; 89ms ago
      Process: 23490 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS)
      Process: 23349 ExecStart=/etc/init.d/supervisor start (code=exited, status=0/SUCCESS)

    Nov 24 13:04:30 xxx supervisor[23349]: Starting supervisor: supervisord.
    Nov 24 13:04:30 xxx systemd[1]: Started LSB: Start/stop supervisor.
    Nov 24 13:04:32 xxx systemd[1]: Stopping LSB: Start/stop supervisor...
    Nov 24 13:04:32 xxx supervisor[23490]: Stopping supervisor: supervisord.
    Nov 24 13:04:32 xxx systemd[1]: Stopped LSB: Start/stop supervisor.
    [....] Starting supervisor (via systemctl): supervisor.serviceJob for supervisor.service failed. See 'systemctl status supervisor.service' and 'journalctl -xn' for details.
     failed!
    [email protected]:~# /etc/init.d/supervisor stop && while /etc/init.d/supervisor status ; do sleep 1; done && /etc/init.d/supervisor start
    [ ok ] Stopping supervisor (via systemctl): supervisor.service.
    ● supervisor.service - LSB: Start/stop supervisor
       Loaded: loaded (/etc/init.d/supervisor)
       Active: failed (Result: exit-code) since Tue 2015-11-24 13:04:32 UTC; 1s ago
      Process: 23490 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS)
      Process: 23526 ExecStart=/etc/init.d/supervisor start (code=exited, status=1/FAILURE)

Nov 24 13:04:32 xxx systemd[1]: supervisor.service: control process exited, code=exited status=1
Nov 24 13:04:32 xxx systemd[1]: Failed to start LSB: Start/stop supervisor.
Nov 24 13:04:32 xxx systemd[1]: Unit supervisor.service entered failed state.
Nov 24 13:04:32 xxx supervisor[23526]: Starting supervisor:
Nov 24 13:04:33 xxx systemd[1]: Stopped LSB: Start/stop supervisor.
[ ok ] Starting supervisor (via systemctl): supervisor.service.
4b9b3361

Ответ 1

Это не обязательно ошибка супервизора. Я вижу из вашего вывода systemctl status, что supervisor запускается через уровень совместимости sysv-init, поэтому сбой может быть в /etc/init.d/supervisor script. Это объясняет отсутствие ошибок в журналах супервизора.

Чтобы отлаживать init script, самым простым способом является добавление set -x в качестве первой инструкции без комментария в этом файле и просмотр в journalctl вывода трассировки выполнения script.

EDIT:

Я воспроизвел и отладил его в тестовой системе с Debian Sid.

Проблема заключается в том, что цель остановки супервизора init- script не проверяет, действительно ли демон завершен, но только посылает сигнал, если процесс существует. Если процесс daemon занимает некоторое время, чтобы завершить работу, последующее действие запуска завершится неудачно из-за процесса умирающего демона, который считается уже запущенным.

Я открыл ошибку в Debian Bug Tracker: http://bugs.debian.org/805920

Временное решение:

Вы можете решить эту проблему с помощью:

/etc/init.d/supervisor force-stop && \
/etc/init.d/supervisor stop && \
/etc/init.d/supervisor start
  • force-stop обеспечит завершение надзора (за пределами systemd).
  • stop убедитесь, что systemd знает, что он завершен.
  • start запускает его снова

Требуется stop после force-stop, иначе systemd будет игнорировать любой последующий запрос start. stop и start могут быть объединены с помощью restart, но здесь я поставил оба из них, чтобы показать, как это работает.

Ответ 2

У меня была эта проблема в ubuntu 14.04, попробовал последнюю версию initd script из debian и @mnencia, но они не сработали для меня. решение принудительной остановки не убило программные процессы, которые они просто продолжали работать после того, как был убит супервизор.

Мое решение состояло в том, чтобы исправить супервизор и запустить и перезапустить части кода initd script, который я не хотел догадываться о хорошем DODTIME, я хотел, чтобы он был готов, как только старый мастер-мастер запускался, поэтому Я добавил логику повтора. Обратите внимание, что это немного подробный, но вы можете просто удалить эхо-вызовы, если вам не нравится это поведение, и вы можете изменить максимальные значения (здесь здесь 20).

start)
    echo -n "Starting $DESC: "
    i=1
    until [ $i -ge 21 ]; do
        start-stop-daemon --start --quiet --pidfile $PIDFILE --startas $DAEMON -- $DAEMON_OPTS  && break
        echo -n -e "\nAlready running, old process still finishing? retrying ($i/20)..."
        let "i += 1"
        sleep 1
    done
sleep 1
    if running ; then
        echo "$NAME."
    else
        echo " ERROR."
    fi
;;
restart)
    echo -n "Restarting $DESC: "
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
    i=1
    until [ $i -ge 21 ]; do
        start-stop-daemon --start --quiet --pidfile $PIDFILE --startas $DAEMON -- $DAEMON_OPTS  && break
        echo -n -e "\nAlready running, old process still finishing? retrying ($i/20)..."
        let "i += 1"
        sleep 1
    done
    echo "$NAME."
    ;;

Я также изменил hashbang (первая строка), поэтому bash используется insted из sh, я хотел использовать let

#! /bin/bash