2010-04-21 100 views
1

我試圖執行像這樣一個Perl腳本:如何在php中執行perl腳本並捕獲錯誤消息?

/usr/bin/ec2-consistent-snapshot 'vol-dr3131c2' 

當Perl腳本失敗,退出使用「死」,並打印出錯誤消息。我可以在手動執行時看到該錯誤消息,但我無法通過PHP捕獲它。

我嘗試沒有成功如下:

exec($command,$output); 
echo system($command,$output); 
passthru($command); 

任何想法?

回答

2

你可以嘗試:

$command = "/usr/bin/ec2-consistent-snapshot 'vol-dr3131c2' > /tmp/exec.out 2>&1" 
exec($command) 
echo file_get_contents('/tmp/exec.out'); 

在 '> /tmp/exec.out 2> & 1' 所有的輸出到/tmp/exec.out,那麼PHP Echo的迴文件重定向。

+0

會試一試。任何想法爲什麼PHP不能捕獲輸出?我有一種感覺,錯誤消息不會輸出stdout。 – Marcel 2010-04-21 04:53:46

+0

錯誤消息可能會變爲stderr,而PHP只接收stdout。我只是簡單地將代碼放在那裏,不用考慮它,但可以刪除'> /tmp/exec.out'部分,然後將stderr重定向到標準輸出'2> 1'。如果這樣,你將不會被留下一個tmp文件和PHP/SHOULD /捕獲錯誤信息。 – ashurexm 2010-04-21 16:48:00

0

不是PHP有反引號?

$output = `$command 2> /tmp/command.err`; 
if (looks_like_command_failed($output)) { 
    $error_message = file_get_contents('/tmp/command.err'); 
} 
+0

不,它沒有。事實上,它運行其他程序的設施非常差(以及5.2中的一個重要的bug:http://bugs.php.net/bug.php?id=44994) – 2010-04-21 16:04:18

+2

事實證明,在我的星球上,PHP確實有反向鏈接:http://www.google.com/search?hl=zh-CN&q=PHP+backticks。 – mob 2010-04-21 16:13:32

0

system()功能的文檔中給出的第一個例子中提到,其可以在沒有被PHP接收到的輸出的情況下工作。該示例將stderr與stdout分開接收,而不使用臨時文件。海報並沒有解釋爲什麼這個方法在system()不成功時會成功。所以沒有答案的根本問題,但也許是一種解決方法。

0

Perl腳本隨着它們的消息進入stderr而死,所以您需要捕獲stderr以及stdout以查看發生了什麼。