php - 如何在后台执行多个bash命令

时间:2015-03-10 18:10:09

标签: php linux apache bash

我尝试使用 exec 函数在后台运行两个bash命令。

 $action[] = "/path/script1 par1 > log1 2>&1";
 ...
 $action[] = "/path/script2 par2 > log2 2>&1";
 ...
 $cmd = "( " .implode(' && ',$action). " ) &";
 exec($cmd);

script1 script2 是bash脚本。

正确执行脚本并将其输出正确保存在其日志文件中,但我的应用程序挂起。似乎最后& 无效。

我已经尝试过了:

 $cmd = "bash -c \"" .implode(' && ',$action). "\" &";

如果我运行一个命令,它在后台工作。

我抓住 $ cmd ,如果我跑:

 ( /path/script1 par1 > log1 2>&1 && /path/script2 par2 > log2 2>&1 ) &
从命令行

,它在后台工作。

我在Red Hat Enterprise Linux AS第3版(Taroon Update 2)上使用Apache / 2.0.52和PHP / 5.2.0

1 个答案:

答案 0 :(得分:1)

答案隐藏在PHP exec documentation

  

如果程序是使用此功能启动的,则为了它   继续在后台运行,程序的输出必须是   重定向到文件或其他输出流。没有这样做会   导致PHP挂起,直到程序执行结束。

将重定向添加到命令行的顶层:

exec( "bash -c \"( ./script1 par1 > log1 2>&1 && ./script2 par2 > log2 2>&1 ) \" >/dev/null 2>&1 & " );

且没有bash -c

exec( "( ./script1 par1 > log1 2>&1 && ./script2 par2 > log2 2>&1 ) >/dev/null 2>&1 & " );

使用PHP 5.3.3-7(命令行调用)进行测试:程序在添加重定向运算符之前挂起,然后终止。