2009-10-07 30 views
1

在Linux上使用PHP,我想確定是否成功執行使用exec()運行的shell命令。我正在使用return_var參數來檢查成功的返回值0.這工作得很好,直到我需要爲必須在後臺運行的進程執行相同的操作。例如,在下面的命令中$ result返回0:後臺進程(linux)的PHP exec()返回值

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

我已經把重定向放在那裏了,我不想捕獲任何輸出。我只想知道該命令已成功執行。這可能嗎?

感謝布

回答

3

我的猜測是,你所要做的是不能直接。通過後臺進程,您可以讓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); 

它不漂亮,肯定有餘地增加的魯棒性和處理併發執行,但總體思路應該起作用。

+0

非常感謝您的回答,非常有幫助。 – Brian 2009-10-07 20:08:41

1

不使用exec()方法。當你發送一個進程到後臺時,它會返回0給exec調用,php將繼續執行,沒有辦法檢索到最終結果。然而,pcntl_fork()會分叉你的應用程序,所以你可以在子進程中運行exec(),並讓它等到它完成。然後以exec調用返回的狀態退出()。 在父進程,您可以訪問pcntl_waitpid即返回代碼()

1

只是我的2美分,如何使用||&& bash的運營商?

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

然後檢查文件是否存在。