在后台运行脚本并从php返回其pid

时间:2013-12-04 20:02:49

标签: php linux shell

我尝试在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。

  1. 为什么命令会停止?

  2. 有没有办法让它像我试图运行它一样在php中运行(不需要换新线程)?

2 个答案:

答案 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上)并且几乎执行了所有这些脚本   瞬间。