【问题标题】:exec() hangs when I run bash command in background当我在后台运行 bash 命令时 exec() 挂起
【发布时间】:2020-05-13 14:32:40
【问题描述】:

我正在尝试从 PHP 脚本作为后台进程运行我的服务器,但它仍然挂起 PHP 脚本。我这样称呼它:

$exec_result = exec('./myapp option1 option2 &> /dev/null &');

我尝试了来自PHP hanging while exec() bash script 的东西,比如添加“set -m &&”或“shopt -u checkjobs &&”,但这没有帮助。我还尝试在 exec() 中调用我的 C++ 实用程序,该实用程序在后台运行命令(基本上只是用“&”调用 std::system),但这也无济于事。使用“nohup”不会改变任何东西。另外,问题不在我的服务器上,因为当我调用“sleep”命令时也会发生同样的事情。

从 bash 调用完全相同的命令会按预期在后台运行进程。老实说,我很困惑和沮丧。我究竟做错了什么?也许 PHP 需要某种权限来运行后台任务?我对 Linux 有点陌生。

如果重要的话,我将从 Debian 10 和 PHP 7.3 开始。

【问题讨论】:

    标签: php exec


    【解决方案1】:

    我已设法修复它,但我不知道为什么新解决方案有效而旧解决方案无效。也许它与 exec() build-it 解析器有关?这两行在 bash 中的工作方式相同,所以我将这归咎于 PHP。

    所以,我换了

    $exec_result = exec('./myapp option1 option2 &> /dev/null &');
    

    $exec_result = exec('./myapp option1 option2 > /dev/null 2>&1 &');
    

    然后就做到了。我已经来回检查了多次,第二行始终有效,而第一行每次都失败。

    【讨论】: