我在Linux中创建了一个简单的C守护进程。守护进程设置为捕获SIGTERM信号,进行一些清理并终止。从命令行运行时,此操作符合预期。通过kill命令将SIGTERM发送到守护程序得到妥善处理。
但我希望能够从PHP应用程序启动和停止守护进程。我在PHP中使用exec()执行此操作。开始
exec("$daemon_name");
并停止
exec("kill $daemon_pid");
以这种方式启动守护程序始终有效,但停止则不行。实际上,当以这种方式启动时,从命令行执行kill也不起作用。现在只有“kill -9”才能运行,这显然不能进行必要的清理。据我所知,这个过程根本就没有得到信号。
这才是我真正得到的。当我在SLES 12或OpenSuSE 42.2上部署这个完全相同的配置时,它不起作用,但在OpenSuSE 42.1上,它确实有效(我可以通过PHP启动和停止)。
这不是权限问题,我验证了这一点。
我不知道什么会导致进程无法接收SIGTERM信号。查看“ps aux”和“ps -ef”的输出,我可以看到从命令行启动的守护进程与通过PHP启动的守护进程没有区别。
编辑: 感谢所有评论到目前为止。他们似乎都没有考虑到完全相同的代码在某些系统上工作,而不是其他系统。我唯一能想到的是守护进程是在不同的环境中启动的。问题:环境中是否有任何进程启动可能导致其忽略信号?
答案 0 :(得分:0)
也许你的问题应该是kill <pid>
可能不起作用的原因。这不是PHP的特定问题。流程很容易忽略kill
。现在你提到它是一个C守护进程,但是,你没有提到守护进程的作用。所以我只假设你的守护进程等待I / O,它没有正确配置超时,你杀了它。然后,无论如何,这个过程都不会被杀死。
您可以在此处阅读https://askubuntu.com/questions/59811/kill-pid-not-really-killing-the-process-why了解可能的解决方案。