PHP exec()返回值为后台进程(linux)

在Linux上使用PHP,我想确定是否成功执行使用exec()运行的shell命令。 我使用return_var参数来检查一个成功的返回值0.这工作正常,直到我需要做一个进程,必须在后台运行相同的事情。 例如,在以下命令中$ result返回0:

exec('badcommand > /dev/null 2>&1 &', $output, $result); 

我把redirect放在那里,我不想捕获任何输出。 我只是想知道命令已经成功执行了。 这可能吗?

谢谢,Brian

我的猜测是你所要做的并不是直接可能的。 通过后台进程,您可以让PHP脚本在存在结果之前继续(并可能退出)。

解决办法是有第二个PHP(或Bash / etc)脚本只执行命令并将结果写入临时文件。

主要的脚本会是这样的:

 $resultFile = '/tmp/result001'; touch($resultFile); exec('php command_runner.php '.escapeshellarg($resultFile).' > /dev/null 2>&1 &'); // do other stuff... // Sometime later when you want to check the result... while (!strlen(file_get_contents($resultFile))) { sleep(5); } $result = intval(file_get_contents($resultFile)); unlink($resultFile); 

command_runner.php将如下所示:

 $outputFile = $argv[0]; exec('badcommand > /dev/null 2>&1', $output, $result); file_put_contents($outputFile, $result); 

它并不漂亮,而且确实有增加健壮性和处理并发执行的空间,但总体思路应该是可行的。

不使用exec()方法。 当你发送一个进程到后台时,它会返回0给exec调用,php将继续执行,没有办法检索到最终结果。

然而,pcntl_fork()将分叉您的应用程序,所以您可以在子进程中运行exec(),并等待它完成。 然后用exec调用返回的状态退出()。 在父进程中,你可以用pcntl_waitpid()来访问那个返回码

只是我的2美分,如何使用|| 或者&& bash运算符?

 exec('ls && touch /tmp/res_ok || touch /tmp/res_bad'); 

然后检查文件是否存在。