web-dev-qa-db-fra.com

supervord arrêtant les processus enfants

L'un des problèmes que je rencontre avec le superviseur est que lorsque j'ai une commande qui engendre à son tour un autre processus, le superviseur n'est pas en mesure de le tuer.

Par exemple, j'ai un processus Java qui, lorsqu'il s'exécute normalement, est comme

 $ zkServer.sh start-foreground
 $ ps -eaf | grep zk
 user 30404 28280  0 09:21 pts/2    00:00:00 bash zkServer.sh start-foreground
 user 30413 30404 76 09:21 pts/2    00:00:10 Java -Dzookeeper.something..something

Le fichier de configuration de supervord ressemble à:

[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL

Ce type de processus qui ont plusieurs enfants n'est pas bien géré par supervord quand il s'agit de les arrêter de supervisorctl. Ainsi, lorsque j'exécute cela à partir de supervisord et que j'essaie de l'arrêter à partir de supervisorctl, seul le processus de niveau supérieur est tué, mais pas le processus Java Java réel).

53
FUD

Le même problème a été rencontré par Rick Hanlon II ici: https://coderwall.com/p/4tcw7w

L'option stopasgroup = true doit être définie dans la section programme pour que supervord arrête non seulement le processus parent mais aussi les processus enfants.

L'exemple est donné comme suit:

[program:some_Django]
 command=python manage.py runserver
 directory=/dir/to/app
 stopasgroup=true

Gardez également à l'esprit que vous pouvez avoir un ancien package de supervord qui n'a pas de fonctionnalité "stopasgroup". J'ai essayé ces paquets Debian sur Raspberry Pi:

  • supervisor_3.0a8 ne fonctionne pas.
  • supervisor_3.0b2-1 fonctionne comme prévu.
86
kuzavas

Une fonction a récemment été ajoutée à supervisord pour envoyer SIGKILL à l'ensemble du groupe de processus. C'est dans github mais pas encore officiellement publié.

Si l'ID de processus est disponible dans un fichier, vous pouvez utiliser le programme pid-proxy

6
Roger Hoover

L'article suivant présente une discussion approfondie du problème:

http://veithen.github.io/2014/11/16/sigterm-propagation.html

3
Andreas Veithen

essayez cette configuration de programme de superviseur:

stopasgroup=true
killasgroup=true
stopsignal=INT
2
Color

Vous pouvez également utiliser des priorités dans /conf.d/your-configuration.conf fichier. Par exemple, si vous voulez d'abord exécuter zookeeper puis kafka vous pouvez spécifier deux programmes.

Une priorité inférieure signifie que le programme démarre en premier et s'arrête en dernier.

0
bex