2012-11-26 28 views
0

我想在Perl中運行一個單獨的進程(一個命令行PHP腳本)。我想捕獲這個進程輸出和返回代碼。或者,我希望能夠終止進程並繼續前進,如果進程花費的時間超過N秒。我應該看什麼?如何從Perl運行進程並捕獲輸出和返回代碼?

+0

現在它說「Perl」,你的評論可以刪除。 –

+0

請不要將編輯恢復爲大寫。 :)它確實是[「perl」或「Perl」,但不是「PERL」](http://perldoc.perl.org/perlfaq1.html#What's-the-difference-between-%22perl%22-and- %22Perl%22%3f) – pilcrow

回答

1

你可以試試IPC::Run

IPC ::運行 - 系統()和背景特效W /管道,redirs,pty具有(UNIX,Win32的)

+0

最簡單,最優雅。 – user974896

0

您可以使用管道的open()得到所有3個目標:

my $pid = open(F, "cat /etc/passwd |") || die "Cant open pipe: $!"; 
eval { 
    # Give 30 secs to read output: 
    local $SIG{ALRM} = sub { kill(9, $pid); die "alarm\n"; }; # NB: \n required 
    alarm(30); 

    # Read output: 
    my $line = <F>; 
    alarm(0); # Remove alarm 

    #..do job with $line 
}; 
# Get errorcode: 
close(F); 
print "Exit status: $?\n"; 
printf "Exit value(return code): %d\n", $?>>8; 
print "Killed by timeout\n" if ($? & 127)==9; 
+0

$?包含返回碼,但不是返回碼。 – ysth

+0

確定已更新,以便能夠檢查任何內容 – PSIAlt

0
use IPC::System::Simple qw/EXIT_ANY $EXITVAL capture/; 

my $output = capture(EXIT_ANY, 'some command'); 
print "exit value was $EXITVAL\n"; 

EXIT_ANY告訴捕獲允許任何退出值;您可以列出允許的列表(capture([0,1,42], ...)),如果遇到另一個列表,捕獲將會拋出異常。默認情況下(如果僅傳遞一個命令來捕獲),任何非零的退出值都會導致異常。

0

就我個人而言,我發現最簡單的是AnyEventAnyEvent::Util :: run_cmd和一個計時器。這裏沒有必要在事件循環中運行整個程序,我經常使用此解決方案進入和退出事件循環。 (以下內容不是警告安全的。)

use AnyEvent; 
use AnyEvent::Util; 

my ($stdout, $stderr, $pid); 

my $cv = AnyEvent::Util::run_cmd [ $^X, -e => '$|++; sleep 2; print "foo\n"; sleep 2' ], 
    '>' => \$stdout, 
    '2>' => \$stderr, 
    '$$' => \$pid, 
; 

my $w = AnyEvent->timer(after => 3, interval => 0, cb => sub { print "killing!\n"; kill SIGINT => $pid }); 

my $rc = $cv->recv(); 
$w = undef; # end the timer. 

print "got rc = [$rc]\n"; 
print "stdout = [$stdout]\n"; 
print "stderr = [$stderr]\n"; 
0

這是一個常見問題。看看這個Perl FAQ了。它基本上解釋了在Perl中運行外部命令的方式。

相關問題