通过shell_exec使用PHP发送SIGHUP信号

时间:2011-10-10 16:36:40

标签: php bash shell ubuntu signals

我正在尝试使用PHP向外部进程发送 SIGHUP 信号。目前,我正在做以下事情:

$pid = shell_exec('ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\'');
shell_exec('kill -s HUP $pid');

当我从命令行运行“ php test.php ”时,我已经验证信号是否按预期发送到正确的进程。

当我通过访问 http://foo.com/bar/test.php 来调用脚本时,不会发送信号,shell_exec也不会返回任何内容。

为了进行测试,我暂时使用root权限运行PHP但遇到了同样的问题,所以我认为这不是权限问题。

有趣的是, shell_exec 会将 pwd 命令的输出和正常运行时间命令返回给浏览器,但不会返回 ls 命令。但是从命令行运行时,shell_exec会正常返回ls的输出。

我缺少这些命令的另一个限制吗?

另外,一些注意事项:

  • 安全模式已关闭
  • error_reporting = E_ALL
  • 禁用任何功能
  • 我已经尝试明确指向二进制文件(例如/ bin / ps和sh -c ps)

1 个答案:

答案 0 :(得分:2)

尝试

echo shell_exec('(ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\') 2>&1');

并查看是否报告了任何错误。此外,您可以尝试使用pgreppkillkillall,而不是使用psgrep

或者,尝试运行ps并自己解析PHP的完整输出。 (preg_match()和/或preg_grep()可能对此有用。) 您可以使用posix_kill()代替运行外部kill计划。

编辑:根据评论,似乎实际问题是缺少或错误设置PATH环境变量。解决此问题的一种方法是在shell中运行echo $PATH,复制输出并使用putenv()PATH设置为PHP中的相同值。另一种解决方案是在shell中使用which来确定ps 的完整路径,并在shell_exec()中使用这些完整路径。