我写了一个PHP程序挂钩到syslog-ng (通过syslog-ng.conf ),它基本上是这样的:
while (!feof(STDIN)) { $input = fgets(STDIN); process($input); } cleanup();
process()和cleanup()是由我定义的。
我面临的问题是, cleanup(2)从来没有被调用,我需要它在程序退出之前执行。
我已经尝试使用pcntl_signal()捕获SIGTERM,SIGHUP和SIGPIPE,并且该应用程序的一部分似乎工作正常(如果我在PHP进程上使用kill -1,我的信号处理程序被调用,它运行cleanup() ),但看来我没有从syslog-ng那里得到这些消息。
如何find系统是否有我需要在MFC中的字体?
我怎样才能获得系统的玻璃颜色?
C ++可执行文件,sh 1:未find
系统用户日志没有被创build
我试图设置STDIN为非阻塞,认为PHP不会调用信号处理程序,因为stream阻塞。 这也不pipe用,我的信号处理程序不会被调用。
我怎么知道syslog-ng什么时候要停止我的应用程序,所以我可以做一些清理?
谢谢,汤姆
更新:我试图捕获所有的信号,从1到31,当syslog-ng重新启动(或者用SIGTERM终止)时,它仍然不会收到任何信息。
在Python中获取windows / system文件夹的位置
当两个不同的参数中有空格时,C ++系统()不工作
主进程从systemd启动时不能分离subprocess
我如何configurationsystemd服务来定期重启?
也许尝试注册cleanup()作为一个PHP 关机功能 ,如下所示:
function cleanup(){} register_shutdown_function("cleanup");
理论上这将导致PHP在退出之前执行该功能。 但是,如果使用强制停止选项(比如kill),这可能不起作用,所以它是(另一个)在黑暗中拍摄的。
我希望你找到有效的东西。 我也有兴趣了解结果。
编辑:我很高兴这为你解决!
这是在黑暗中的一个镜头,但尝试重新写你的循环如下:
do { $input = fgets(STDIN); process( $input ); while ( !feof( STDIN ) ) { cleanup();
这个想法是,当syslog-ng关闭stdout(假设它是这样做的),fgets将尝试读取并实际到达EOF。
突然终止您的PHP脚本而没有正确的清理可能是因为运行时错误发生(例如,因为您的进程()没有准备好处理fgets()返回的EOF时返回的空字符串)。
我可以想到几件事情,你可以尝试解决这个问题:
1)利用PHP的set_error_handler()函数 。
2)把上面提到的代码放在一个try / catch结构中,试图捕获可能抛出的异常。
3)当你运行该脚本时,确保你正在捕获输出和标准错误。 改变命令行是这样的:
/path/to/script 2>&1 >> /path/to/logfile.txt
这将帮助你发现错误
最后,如果确实是PHP无法捕获信号的情况,则必须使用trap命令通过shell脚本执行此操作。 就像是:
#!/bin/sh
#
# This gets run when the script is hit with a signal
#
trap /path/to/script --cleanup
#
# Run our script
#
/path/to/script 2>&1 >> /path/to/logfile.txt
如果在脚本中有cleanup()需要的特定数据,那么您将不得不查看序列化数据并将其写入磁盘以供清理脚本读取。
祝你好运!
PHP是否真的为你处理你的信号? 尝试使用另一种语言进行原型设计,以获得更多的控制权。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。