Супервизор, останавливающий дочерние процессы

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

Ответ 1

Такую же проблему столкнула Рик Хэнлон 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 на малине Pi:

  • supervisor_3.0a8 не работает.
  • supervisor_3.0b2-1 работает как ожидалось.

Ответ 2

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

trap "kill -- -$$" EXIT

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

Ответ 3

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

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

Ответ 5

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

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