Le superviseur ne redémarre pas la moitié du temps

j'essaie de déployer une application Django en utilisant Uwsgi et son superviseur sur une machine qui exécute Debian 8.1.

quand je redémarre via sudo systemctl restart supervisor il ne redémarre pas la moitié du temps.

$ root@host:/# systemctl start supervisor
    Job for supervisor.service failed. See 'systemctl status supervisor.service' and 'journalctl -xn' for details.
$ root@host:/# 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.

Cependant il n'y a rien dans le superviseur ou uwsgi journaux. Le superviseur 3.0 utilise cette configuration pour uwsgi:

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

stopsignal=QUIT a été ajouté car UWSGI ignore le signal par défaut (SIGTERM) sur stop et se fait tuer brutalement avec le départ de SIGKILL orphelin de travailleurs.

y a-t-il un moyen d'enquêter sur ce qui se passe ?

EDIT:

Essayé comme mnencia conseillé : /etc/init.d/supervisor stop && while /etc/init.d/supervisor status ; do sleep 1; done && /etc/init.d/supervisor start mais ça échoue la moitié du temps.

 root@host:~# /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!
    root@host:~# /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.
18
demandé sur Paul K. 2015-09-23 14:30:45

2 réponses

il ne s'agit pas nécessairement d'une erreur de la part du superviseur. Je vois de votre systemctl status sortie supervisor est démarré par la couche de compatibilité sysv-init, donc l'échec pourrait être dans le /etc/init.d/supervisor script. Cela expliquerait l'absence d'erreurs dans le supervisord journaux.

déboguer le script d'initialisation, le plus simple est d'ajouter un set -x comme première instruction de non-commentaire dans ce fichier, et regardez dans le journalctl sortie de la trace du script exécution.

EDIT:

Je l'ai reproduit et débogué sur un système de test avec Debian Sid.

le problème est que Le arrêt cible du superviseur init-script ne vérifie pas si le démon a été réellement terminé mais n'envoie un signal que si le processus existe. Si le processus de démon prend un certain temps pour s'arrêter, le démarrer l'action échouera à cause du processus du démon mourant, qui est compté comme déjà en cours d'exécution.

j'ai ouvert un bug sur Debian Bug Tracker: http://bugs.debian.org/805920

palliatif:

Vous pouvez contourner le problème:

/etc/init.d/supervisor force-stop && \
/etc/init.d/supervisor stop && \
/etc/init.d/supervisor start
  • force-stop s'assurera que la supervision a été terminée (à l'extérieur de systemd).
  • stop assurez-vous que systemd sait qu'il est terminé
  • start recommence

stop après le force-stop est nécessaire sinon systemd ignorera tout start demande. stop et start peut être combiné en utilisant restart, mais ici je les ai mis tous les deux pour montrer comment ça marche.

16
répondu mnencia 2015-11-24 14:45:36

j'ai eu ce problème dans ubuntu 14.04, j'ai essayé le dernier script initd de la solution debian et @mnencia mais ils n'ont pas fonctionné pour moi. solution d'arrêt de force n'a pas tué les processus de programme qu'ils ont juste continué à courir après que supervisord a été tué.

ma solution était de patcher le supervisord et de démarrer et redémarrer des parties du code de script initd. Je ne voulais pas deviner un bon moment, je voulais qu'il soit en place dès que l'ancien processus maître superviseur meurt, donc j'ai ajouté une logique de retouche. Notez que c'est un peu verbeux, mais vous pouvez simplement supprimer les appels echo si vous n'aimez pas ce comportement et vous pouvez changer les reties max (paramétré à 20 ici).

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

j'ai aussi changé le hashbang (première ligne) donc bash est utilisé insté de sh, je voulais utiliser let

#! /bin/bash
0
répondu gonz 2017-06-22 20:04:25