2010-04-21 110 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以查看发生了什么。