Как заставить supervisord подождать корректного завершения процесса?
Использую для демонизации PHP-процессов supervisord. Демон может долго запрашивать что-нибудь по какому-нибудь API и в этот момент кому-нибудь может понадобиться увеличить количество каких-нибудь процессов и он всё перезапустит. Или просто кто-то может жмакнуть перезапуск демона, а в это время демон выполняет важную работу.
Я назначаю обработчика pcntl_signal(SIGTERM, "handler"); в обработчике указываю для 15-го сигнала не вызывать exit, но процесс всё равно перезапускается, его pid меняется.
Если запускаю из консоли и перехватываю сигнал 2, ctrl+c, то это работает нормально, процесс не останавливается.
Вот вопрос - как я могу из PHP-кода заставить супервизор подождать?
На сколько я понял вам нужен "мягкий перезапуск"(reload). Супервизор рестартует процесс, он не сделает вам релоад, как вы хотите. Вот отличная статья о мягком перезапуске от Badoo habrahabr.ru/company/badoo/blog/252809, с исходниками на гитхабе https://github.com/badoo/habr/tree/master/phprocksyd . Но там нужно патчить PHP, что не всегда возможно.
Опишите подробней, что делает ваш демон, можно ли форкнуть ваш процесс и обрабатывать задачи в форках?
Демон берёт из очереди ActiveMQ сообщение, извлекает из базы связанную с сообщением задачу некоторого типа и выполняет работу. При необходимости генерирует новое сообщение для обработки следующего этапа задачи. Мои опасения связаны с тем что из-за преждевременного завершения процесса может не сгенерироваться следующее сообщение, или может быть получен ответ по API но не сохранён потеряется id ответа от сервера, или случится что-то что я ещё не могу предугадать.
А перезапускать супервизора придётся, однажды не хватит демонов для какой-то из очередей, нужно будет изменить конфиг, и из-за этого будут остановлены вообще демоны.
Про форки даже не думал, надо будет вечером подумать. За ссылку спасибо, в трамвае по дороге домой прочитаю.