我尝试在php中调用一个应用程序:
ob_start();
passthru("(cd /opt/server/TrackServer/release && ./TrackServer& ) && pidof TrackServer");
$pid = ob_get_clean();
var_dump($pid);
exit;
目标是在其路径中运行TrackServer并获取它的进程ID,以便我在进行一些测试后关闭它。
当我在终端中运行命令时:
(cd /opt/server/TrackServer/release && nohup ./TrackServer&) && pidof TrackServer
我得到正确的pid返回但是在php中命令停止并且不再进一步,TrackServer启动并运行但我必须从终端杀死它以解锁php脚本,在杀死进程后php脚本打印出来我刚从终端关闭的流程正确的pid。
为什么命令会停止?
有没有办法让它像我试图运行它一样在php中运行(不需要换新线程)?
答案 0 :(得分:0)
来自passthru manual page:passthru()函数类似于exec()函数,因为它执行命令。
这意味着您无法直接执行命令行,因为它会运行多个命令并依赖shell来根据需要实现后台处理和子shell。
请改为尝试:
passthru("/bin/bash -c 'cd /opt/server/TrackServer/release && nohup ./TrackServer& && pidof TrackServer'");
答案 1 :(得分:-1)
编辑: 我找到了一个有效的解决方案:
ob_start();
passthru("/bin/bash -c 'cd /opt/server/TrackServer/release && nohup ./TrackServer&' > /dev/null 2>&1 &");
passthru("pidof TrackServer");
$pid = ob_get_clean();
该命令正在停止,因为:
Run multiple exec commands at once (But wait for the last one to finish)
PHP的exec函数将始终等待您的响应 执行。但是你可以发送stdout&这个过程的一个错误 到/ dev / null(在unix上)并且几乎执行了所有这些脚本 瞬间。