Супервизор, останавливающий дочерние процессы
Одна из проблем, с которыми я сталкиваюсь с 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
Ответ 4
В следующей статье представлено углубленное обсуждение проблемы:
http://veithen.github.io/2014/11/16/sigterm-propagation.html
Ответ 5
Вы также можете использовать приоритеты в файле /conf.d/your-configuration.conf
. Например, если вы хотите сначала запустить zookeeper, а затем kafka, вы можете указать две программы.
Нижний приоритет означает, что программа запускается сначала и останавливается последним.