супервизор, остановка дочерних процессов - PullRequest
53 голосов
/ 01 февраля 2012

Одна из проблем, с которыми я сталкиваюсь при работе с 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.Поэтому, когда я запускаю это от супервизора и пытаюсь остановить его от супервизора, уничтожается только процесс верхнего уровня, но не сам процесс Java.

Ответы [ 6 ]

82 голосов
/ 13 декабря 2013

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

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

Пример приведен как:

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

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

  • supervisor_3.0a8 не работает.
  • supervisor_3.0b2-1 работает должным образом.
11 голосов
/ 13 марта 2014

Раннее выполнение следующего сценария main bash, вызванного supervisord, решило проблему для меня:

trap "kill -- -$$" EXIT

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

6 голосов
/ 01 февраля 2012

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

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

3 голосов
/ 11 января 2015

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

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

2 голосов
/ 28 июня 2018

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

stopasgroup=true
killasgroup=true
stopsignal=INT
0 голосов
/ 05 ноября 2016

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

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

...