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


How to exec in background multiple bash command

我正在尝试使用 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 Release 3(Taroon Update 2)上使用 Apache/2.0.52 和 PHP/5.2.0

答案隐藏在 PHP exec 文档中:

如果程序使用此函数启动,以便它 继续在后台运行,程序的输出必须是 重定向到文件或其他输出流。如果不这样做,将 导致 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(命令行调用)进行测试:程序在添加重定向运算符之前挂起,之后终止。