it-swarm.dev

Kierownik nie uruchamia ponownie połowy czasu

Próbuję wdrożyć aplikację Django przy użyciu Uwsgi i nadzorcy na komputerze z Debianem 8.1.

Po ponownym uruchomieniu przez Sudo systemctl restart supervisor nie uruchamia się ponownie przez połowę czasu.

$ [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.

Jednak w dzienniku nadzorcy lub uwsgi nie ma nic. Supervisor 3.0 działa z tą konfiguracją dla uwsgi:

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

stopsignal = QUIT został dodany, ponieważ UWSGI ignoruje domyślny sygnał (SIGTERM) przy zatrzymaniu i zostaje brutalnie zabity, gdy SIGKILL opuszcza pracowników Orphana.

Czy istnieje sposób na zbadanie tego, co się dzieje?

EDYTOWAĆ:

Wypróbowany jako zalecany przez mnencia: /etc/init.d/supervisor stop && while /etc/init.d/supervisor status ; do sleep 1; done && /etc/init.d/supervisor start , Ale nadal nie działa.

 [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.
20
Paul K.

To niekoniecznie jest błąd ze strony przełożonego. Widzę z twojego wyjścia systemctl status, że supervisorjest uruchamiany przez warstwę kompatybilności sysv-init, więc błąd może być w skrypcie /etc/init.d/supervisor. Tłumaczyłoby to brak błędów w dziennikach nadzorcy.

Aby debugować skrypt inicjujący, najłatwiejszym sposobem jest dodanie kodu set -x jako pierwszej instrukcji bez komentarza w tym pliku, a na wyjściu journalctlwyświetlenie śledzenia wykonania skryptu.

EDYCJA:

Odtwarzałem go i debugowałem w systemie testowym z Debianem Sidem. 

Problem polega na tym, że cel stop skryptu inicjującego superwizora nie sprawdza, czy demon został naprawdę zakończony, ale wysyła tylko sygnał, jeśli proces istnieje. Jeśli proces demona wymaga czasu na zamknięcie, kolejna akcja start zakończy się niepowodzeniem z powodu procesu demona umierającego, który jest liczony jako już uruchomiony.

Otworzyłem błąd w Debian Bug Tracker: http://bugs.debian.org/805920

Obejście problemu:

Możesz obejść problem za pomocą: 

/etc/init.d/supervisor force-stop && \
/etc/init.d/supervisor stop && \
/etc/init.d/supervisor start
  • force-stop zapewni, że supervisord został zakończony (poza systemd).
  • stopupewnij się, że systemd wie, że jest zakończony
  • starturuchamia go ponownie

stoppo wymaganiu force-stop jest inaczej, inaczej systemd zignoruje każde następne żądanie startname__. stopi startmogą być łączone za pomocą restartname__, ale tutaj umieściłem obie z nich, aby pokazać, jak to działa. 

18
mnencia

Miałem ten problem w ubuntu 14.04, wypróbowałem najnowszy skrypt initd z rozwiązania Debian i @mnencia, ale nie działali dla mnie. rozwiązanie force-stop nie zabiło procesów programu, które po prostu zostały uruchomione po zabiciu supervisorda.

Moim rozwiązaniem było załatanie supervisorda i rozpoczęcie i ponowne uruchomienie części kodu skryptu initd, którego nie chciałem odgadnąć, dobry DODTIME, chciałem, aby był gotowy, jak tylko umrze stary proces nadrzędny nadzorcy, więc dodałem logikę ponownej próby . Zauważ, że jest to dość gadatliwe, ale możesz po prostu usunąć wywołania echa, jeśli nie podoba ci się to zachowanie i możesz zmienić maksymalne powtórzenia (ustawione na 20 tutaj).

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."
    ;;

Zmieniłem również hashbang (pierwsza linia), więc bash jest używany z sh, chciałem użyć let

#! /bin/bash
0
gonz