通过shell_exec通过PHP发送SIGHUP信号

问题描述:

我正在尝试使用PHP向外部进程发送SIGHUP信号。目前,我做了以下内容:通过shell_exec通过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
  • 没有功能是禁用
  • 我试图明确指向二进制文件(防爆/斌/ PS和sh -c PS)
+0

我必须说这个问题被问到,+1 –

尝试

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

并查看是否有任何错误报告。此外,您可以尝试pgrep,pkillkillall,而不是与psgrep混淆。

或者,您可以尝试运行ps并自行解析其全部输出。 (preg_match()和/或preg_grep()可能对此有用。) 而且您可以使用posix_kill()而不是运行外部kill程序。

编辑:根据意见,似乎实际的问题是一个缺失或不正确的设置PATH环境变量。解决此问题的一种方法是在shell中运行echo $PATH,复制输出并将PATH设置为PHP中的相同值putenv()。另一种解决方案是在shell中使用which来确定到达ps等的完整路径。,并在shell_exec()中使用那些完整路径。

+0

您的示例代码输出:** sh:ps:找不到sh:grep:找不到sh:grep:找不到**。我问了一个朋友,他说*/bin/sh -c ps *应该可以工作,但是类似地,返回:**/bin/sh:ls:找不到** – WilHall

+2

您的'PATH'环境变量可能在网络服务器下运行时没有(正确)设置。要么是这样,要么就是在一些限制性的*中运行,它们根本不允许你访问'ps'可执行文件。尝试在shell中运行'which ps'来找出'ps'的完整路径,看看是否有帮助。 –

+0

似乎是路径。我修改了我的原始行来使用所有绝对路径,它工作。然后,我决定使用pkill来代替 - 非常简单。请在您的回答中添加PATH提及,并且我将其标记为已接受。谢谢! – WilHall