супервизор останавливает дочерние процессы

Одна из проблем, с которыми я сталкиваюсь при работе с supervisord, заключается в том, что когда у меня есть команда, которая, в свою очередь, порождает другой процесс, supervisord не может его убить.

Например, у меня есть процесс Java, который при нормальном запуске похож на

 $ 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

Файл конфигурации супервизора выглядит так:

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

Процессы такого типа, которые имеют несколько дочерних процессов, плохо обрабатываются супервизором, когда дело доходит до их остановки из supervisorctl. Поэтому, когда я запускаю это из supervisord и пытаюсь остановить его из supervisorctl, уничтожается только процесс верхнего уровня, но не фактический процесс Java.


person FUD    schedule 01.02.2012    source источник
comment
Насколько я понимаю, systemd init-замена использует cgroups позволяет надежно отслеживать дочерние процессы. Возможно, он подойдет для ваших нужд.   -  person sarnold    schedule 01.02.2012


Ответы (6)


С той же проблемой столкнулся Рик Хэнлон II здесь: https://coderwall.com/p/4tcw7w.

В разделе программы должна быть установлена ​​опция stopasgroup=true, чтобы супервизор останавливал не только родительский процесс, но и дочерние процессы.

Пример дается как:

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

Кроме того, имейте в виду, что у вас может быть более старый пакет supervisord, который не имеет функциональности «stopasgroup». Я попробовал эти пакеты Debian на Raspberry Pi:

  • supervisor_3.0a8 не работает.
  • supervisor_3.0b2-1 работает как положено.
person kuzavas    schedule 13.12.2013
comment
Также обратите внимание, что supervisord не принимает изменения конфигурации автоматически. Вам потребуется запустить supervisorctl update, чтобы применить изменения к вашей конфигурации, или перезапустить процесс supervisord. - person jjmontes; 24.08.2016
comment
Это действительно должно быть вариантом по умолчанию. - person Shubham Chaudhary; 01.02.2017
comment
Это отлично сработало для меня с супервизором 3.2. Спасибо. - person Cerin; 05.01.2018

Выполнение следующего в начале основного сценария bash, вызванного супервизором, устранило проблему для меня:

trap "kill -- -$$" EXIT

Это убивает всю группу процессов при выходе из основного сценария, например, когда он уничтожается супервизором.

person Fred Yankowski    schedule 12.03.2014

Недавно в supervisord была добавлена ​​функция отправки SIGKILL всей группе процессов. Он находится в github, но официально еще не выпущен.

Если идентификатор процесса доступен в файле, вы можете использовать программу pid-proxy.

person Roger Hoover    schedule 01.02.2012

В следующей статье есть подробное обсуждение проблемы:

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

person Andreas Veithen    schedule 11.01.2015
comment
exec ... решил это для меня. Первый вариант в статье. Спасибо - person Alon Catz; 08.08.2015
comment
Спасибо за то, что научили ловить рыбу, а не поставлять ее ;) - person Gökçer Gökdal; 11.10.2017

попробуйте эту конфигурацию программы супервизора:

stopasgroup=true
killasgroup=true
stopsignal=INT
person Color    schedule 28.06.2018

Вы также можете использовать приоритеты в файле /conf.d/your-configuration.conf. Например, если вы хотите сначала запустить zookeeper, а затем kafka, вы можете указать две программы.

Более низкий приоритет означает, что программа запускается первой и останавливается последней.

person baqx0r    schedule 05.11.2016