Передача сигналов управляемым процессам с помощью supervisord

Я использую supervisord для создания и управления приложением FastCGI, которое я пишу на C для цели Linux. У меня есть обработчик сигналов, который корректно завершает работу моего приложения при получении сигнала SIGINT. Я убедился, что обработчик сигналов работает должным образом, запустив приложение в окне терминала и нажав Ctrl-C для выхода.

При выдаче команды «shutdown» для supervisord (через supervisorctl) кажется, что supervisord не может принудительно закрыть приложение без вызова SIGKILL:

2010-08-20 10:02:49,661 INFO waiting for cse to die
2010-08-20 10:02:52,665 INFO waiting for cse to die
2010-08-20 10:02:55,669 INFO waiting for cse to die
2010-08-20 10:02:58,672 INFO waiting for cse to die
2010-08-20 10:02:59,673 WARN killing 'cse' (2031) with SIGKILL
2010-08-20 10:02:59,674 INFO stopped: cse (terminated by SIGKILL)

У меня есть следующее в моем файле supervisord.conf

stopsignal=INT

Я предполагаю, что supervisord выдает «стоп-сигнал» при вызове команды выключения, поэтому я воспринимаю операторы INFO как указание на то, что мое приложение не отвечает на SIGINT, выданный супервизором.

Как мне отладить сигнал, проходящий между супервизором и моим приложением?


person HikeOnPast    schedule 20.08.2010    source источник
comment
Я подтвердил, что INT выдается при вызове команды выключения, поэтому записи в журнале «ожидание смерти cse» определенно указывают на то, что приложение не видит SIGINT.   -  person HikeOnPast    schedule 21.08.2010


Ответы (3)


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

Скорее похоже, что supervisord перестает регистрировать вывод stderr дочернего процесса, как только получает запрос на вызов сигнала остановки. В результате любая регистрация завершения дочернего процесса на основе stderr не будет обрабатываться supervisord. В моем случае это создавало впечатление, что дочерний процесс не получал SIGINT, поскольку он ничего не записывал в stderr после вызова сигнала.

person HikeOnPast    schedule 31.08.2010
comment
Есть ли способ заставить supervisord продолжать собирать выходные данные журнала после того, как процесс был отправлен SIGINT из команды stop? - person Neil; 17.05.2012
comment
+1 к вопросу @ Нила. Отсутствие stdout и stderr делает невозможным отладку проблем во время завершения работы. - person Yevgeniy Brikman; 09.12.2015

Вы можете запустить supervisord из командной строки в режиме отладки и получить дополнительную информацию.

супервизор -n -e отладка

person Roger Hoover    schedule 23.08.2010
comment
Спасибо. Вывод, который я первоначально опубликовал, был сгенерирован с использованием супервизора.conf, эквивалентного -n -e отладке (не демонизировать и использовать ведение журнала уровня отладки). - person HikeOnPast; 24.08.2010

Эта ошибка была исправлена ​​в выпуске Supervisor 3.0a10 (30 марта 2011 г.) в соответствии с этим коммитом: nofollow">https://github.com/Supervisor/supervisor/commit/e19cbc185dfad045c8775750d36ab8ceed4c4dfb

person Neil    schedule 06.09.2012