Я написал PHP-программу, которая подключается к syslog-ng
(через syslog-ng.conf
), и в основном это так:
while (!feof(STDIN)) {
$input = fgets(STDIN);
process($input);
}
cleanup();
где process()
и cleanup()
определяются мной.
Проблема, с которой я столкнулся, заключается в том, что cleanup(2)
никогда не вызывается, и мне нужно, чтобы он был выполнен до выхода из программы.
Я пытался поймать SIGTERM, SIGHUP и SIGPIPE, используя pcntl_signal()
, и эта часть приложения, кажется, работает нормально (если я использую kill -1 в процессе PHP, мой обработчик сигналов вызывается и он запускает cleanup()
), но похоже, что я я не получаю эти сообщения от syslog-ng.
Я попытался установить STDIN на неблокирующий, думая, что PHP не будет вызывать обработчики сигналов, потому что поток блокируется. Это тоже не сработало, мои обработчики сигналов не вызывались.
Как мне узнать, когда syslog-ng собирается остановить мое приложение, чтобы я мог выполнить некоторую очистку?
Спасибо, Том
ОБНОВЛЕНИЕ: я пытался перехватить все сигналы, от 1 до 31, и он по-прежнему ничего не получает, когда syslog-ng перезапускается (или уничтожается с помощью SIGTERM).