【发布时间】:2009-10-30 18:27:28
【问题描述】:
我编写了一个挂钩到syslog-ng(通过syslog-ng.conf)的PHP程序,基本上是这样的:
while (!feof(STDIN)) {
$input = fgets(STDIN);
process($input);
}
cleanup();
process() 和 cleanup() 由我定义。
我面临的问题是 cleanup(2) 从未被调用,我需要在程序退出之前执行它。
我尝试使用pcntl_signal() 捕获 SIGTERM、SIGHUP 和 SIGPIPE,并且应用程序的这一部分似乎工作正常(如果我在 PHP 进程上使用 kill -1,我的信号处理程序被调用并运行 cleanup() ),但似乎我没有从 syslog-ng 收到这些消息。
我尝试将 STDIN 设置为非阻塞,认为 PHP 不会调用信号处理程序,因为流是阻塞的。那也不起作用,我的信号处理程序不会被调用。
我如何知道 syslog-ng 何时将停止我的应用程序,以便我进行一些清理工作?
谢谢, 汤姆
更新:我已尝试捕获从 1 到 31 的所有信号,但当 syslog-ng 重新启动(或被 SIGTERM 杀死)时,它仍然没有收到任何信号。
【问题讨论】:
-
重新标记,这与信号处理无关(与信号处理领域无关,与处理OS信号有关)。
-
这可能是一个愚蠢的问题,但是您是否尝试过将清理注册为关闭功能? us.php.net/manual/en/function.register-shutdown-function.php
-
编辑汤姆。很高兴它对你有用!
标签: php linux syslog syslog-ng