在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');
然后检查文件是否存在。