微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你怎么知道syslog-ng是否会停止你的监听守护进程?

我写了一个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那里得到这些消息。

系统函数调用asynchronous?

如何find系统是否有我需要在MFC中的字体?

我怎样才能获得系统的玻璃颜色?

C ++可执行文件,sh 1:未find

系统用户日志没有被创build

我试图设置STDIN为非阻塞,认为PHP不会调用信号处理程序,因为stream阻塞。 这也不pipe用,我的信号处理程序不会被调用

我怎么知道syslog-ng什么时候要停止我的应用程序,所以我可以做一些清理?

谢谢,汤姆

更新:我试图捕获所有的信号,从1到31,当syslog-ng重新启动(或者用SIGTERM终止)时,它仍然不会收到任何信息。

在Python中获取windows / system文件夹的位置

在C ++的相同进程空间内执行一个外部可执行文件

当两个不同的参数中有空格时,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时返回的空字符串)。

启用PHP错误日志记录来查看发生了什么。

我可以想到几件事情,你可以尝试解决这个问题:

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] 举报,一经查实,本站将立刻删除。

相关推荐