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