我想在Perl中運行一個單獨的進程(一個命令行PHP腳本)。我想捕獲這個進程輸出和返回代碼。或者,我希望能夠終止進程並繼續前進,如果進程花費的時間超過N秒。我應該看什麼?如何從Perl運行進程並捕獲輸出和返回代碼?
0
A
回答
1
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
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
就我個人而言,我發現最簡單的是AnyEvent與AnyEvent::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中運行外部命令的方式。
相關問題
- 1. 同時捕獲輸出和返回代碼的行數
- 2. 如何運行passwd -S並在Perl中捕獲其輸出?
- 3. 如何從Python中的子進程獲取返回代碼和輸出?
- 4. 從powershell運行VBS並捕獲輸出
- 5. 如何從perl程序執行python代碼並使用python代碼的輸出
- 6. 如何捕獲返回非零退出代碼的外部程序的輸出?
- 7. 在AutoIT中,我如何運行子進程並一次捕獲一行輸出?
- 8. 捕獲從Perl批處理文件返回的錯誤代碼
- 9. 運行外部子進程並閱讀返回代碼
- 10. 如何從Haskell龜的進程捕獲stdout和stderr輸出?
- 11. 如何在Perl中運行外部命令並捕獲其輸出?
- 12. 如何運行PHP後臺進程,並獲得返回值
- 13. 在後臺執行程序,並捕獲返回代碼(php和windows)
- 14. xargs並行 - 捕獲退出代碼
- 15. 如何從perl`command`調用捕獲多行輸出?
- 16. 編譯,運行並返回C++程序的輸出,從PHP
- 17. 捕獲子進程輸出
- 18. 如何從GAMS獲取返回代碼Python API運行
- 19. 從python子進程捕獲輸出
- 20. 如何從Java代碼運行命令並讀取輸出?
- 21. 如何捕獲Karma返回/退出代碼?
- 22. 如何爲一個進程設置輸入和捕獲輸出?
- 23. 如何自動縮進並從一行代碼輸入代碼?
- 24. 運行並從後臺進程獲得輸出
- 25. 如何在PHP中捕獲捕獲子進程輸出
- 26. Perl fork fork線程捕獲輸出
- 27. 如何將退出代碼從Ada進程返回到調用Windows進程?
- 28. 如何在終端運行命令並捕獲輸出
- 29. 如何從PGP獲取返回代碼命令行代碼
- 30. 的Perl:打開/關閉捕獲返回代碼
現在它說「Perl」,你的評論可以刪除。 –
請不要將編輯恢復爲大寫。 :)它確實是[「perl」或「Perl」,但不是「PERL」](http://perldoc.perl.org/perlfaq1.html#What's-the-difference-between-%22perl%22-and- %22Perl%22%3f) – pilcrow