我正在尝试使用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的输出。
我缺少这些命令的另一个限制吗?
另外,一些注意事项:
答案 0 :(得分:2)
尝试
echo shell_exec('(ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\') 2>&1');
并查看是否报告了任何错误。此外,您可以尝试使用pgrep
,pkill
或killall
,而不是使用ps
和grep
。
或者,尝试运行ps
并自己解析PHP的完整输出。 (preg_match()
和/或preg_grep()
可能对此有用。)
您可以使用posix_kill()
代替运行外部kill
计划。
编辑:根据评论,似乎实际问题是缺少或错误设置PATH
环境变量。解决此问题的一种方法是在shell中运行echo $PATH
,复制输出并使用putenv()
将PATH
设置为PHP中的相同值。另一种解决方案是在shell中使用which
来确定ps
等的完整路径,并在shell_exec()
中使用这些完整路径。