【问题标题】:php - How to exec in background multiple bash commandphp - 如何在后台执行多个 bash 命令
【发布时间】:2015-03-10 18:10:09
【问题描述】:

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

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

script1script2 是 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 更新 2)上使用 Apache/2.0.52 和 PHP/5.2.0

【问题讨论】:

    标签: php linux apache bash


    【解决方案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 测试(命令行调用):程序在添加重定向运算符之前挂起,然后终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多