2010-08-20 1 views
3

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

При выдаче команды «выключение» в 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 проблема «stopsignal» при вызове команды останова, поэтому я принимаю заявление INFO как признак того, что мое приложение не отвечает на SIGINT, выданным supervisord.

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

+0

Я подтвердил, что INT выдается при вызове команды останова, так «... ожидая, что cse to die» записи журнала определенно свидетельствуют о том, что приложение не видит SIGINT. – HikeOnPast

ответ

3

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

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

+1

Есть ли способ заставить 'supervisord' продолжать собирать выходные данные журнала после того, как процесс был отправлен' SIGINT' из команды 'stop'? – Neil

+1

+1 на @ вопрос Нейла. Не видя 'stdout' и' stderr', невозможно отладить проблемы во время выключения. –

2

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

supervisord -n -e отлаживать

+0

Спасибо. Вывод, который я изначально опубликовал, был сгенерирован с использованием эквивалента superisord.conf «-n -e debug» (не демонамизировать и использовать журнал регистрации отладки). – HikeOnPast

Смежные вопросы