【发布时间】:2017-10-08 22:12:51
【问题描述】:
我在 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 启动的守护进程之间没有区别。
编辑: 感谢迄今为止所有的cmets。他们似乎都没有考虑到完全相同的代码可以在某些系统上运行,而在其他系统上则不行。我唯一能想到的是,守护进程是在不同的环境中启动的。问题:进程启动的环境中是否有任何东西会导致它忽略信号?
【问题讨论】:
-
我已将问题跟踪到两种情况之间的块掩码差异。我为问题here 创建了一个新线程
-
这个问题现在已经解决了。请参阅上面评论中的链接。