通过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)
尝试
echo shell_exec('(ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\') 2>&1');
并查看是否有任何错误报告。此外,您可以尝试pgrep
,pkill
或killall
,而不是与ps
和grep
混淆。
或者,您可以尝试运行ps
并自行解析其全部输出。 (preg_match()
和/或preg_grep()
可能对此有用。) 而且您可以使用posix_kill()
而不是运行外部kill
程序。
编辑:根据意见,似乎实际的问题是一个缺失或不正确的设置PATH
环境变量。解决此问题的一种方法是在shell中运行echo $PATH
,复制输出并将PATH
设置为PHP中的相同值putenv()
。另一种解决方案是在shell中使用which
来确定到达ps
等的完整路径。,并在shell_exec()
中使用那些完整路径。
您的示例代码输出:** sh:ps:找不到sh:grep:找不到sh:grep:找不到**。我问了一个朋友,他说*/bin/sh -c ps *应该可以工作,但是类似地,返回:**/bin/sh:ls:找不到** – WilHall
您的'PATH'环境变量可能在网络服务器下运行时没有(正确)设置。要么是这样,要么就是在一些限制性的监狱中运行,它们根本不允许你访问'ps'可执行文件。尝试在shell中运行'which ps'来找出'ps'的完整路径,看看是否有帮助。 –
似乎是路径。我修改了我的原始行来使用所有绝对路径,它工作。然后,我决定使用pkill来代替 - 非常简单。请在您的回答中添加PATH提及,并且我将其标记为已接受。谢谢! – WilHall
我必须说这个问题被问到,+1 –