PHP后台进程&&在命令


PHP background process with && in command

我知道我们可以使用以下命令运行后台进程:

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

(取自:Run PHP Task asynchronous)

然而,我有一个依赖于第一次执行状态的脚本。例子:

mongoexport ... | awk ... > my.csv && zip myzip my.csv

CSV文件必须存在才能进行压缩。
更新:文件名和一些查询条件是用户提交的值。

所以我有这样的东西:

exec("mongoexport ... | awk ... > my.csv && zip myzip my.csv > /dev/null 2>&1 &);

但这不起作用。PHP挂起,等待脚本完成运行。

我试着

exec("mongoexport ... | awk ... > my.csv &);

那么&&是它没有在后台运行的原因吗?
如何使示例在后台运行?

exec("(mongoexport ... | awk ... > my.csv && zip myzip my.csv) > /dev/null 2>&1 &")

它告诉shell在后台进程中运行括号中包含的所有命令序列并重定向输出,因此exec函数没有什么可等待的。

在您的示例中,从exec启动的shell等待awk完成,然后在后台运行zip(如果awk以状态0退出)