2010-10-03 135 views
0

使用PHP的proc_open(),我可以啓動一個過程,從STDOUTSTDERR(分別)讀取使用fread():當所述工藝運行在時間的字節的任意數,檢測當該過程在STDOUTSTDERR管使用feof()完成,然後使用proc_close()獲取進程的退出代碼。我已經在PHP中完成了所有這些。它運作良好,並給我很多控制什麼是PHP的proc_open(),proc_close()等Perl的等價物?

有沒有辦法做到所有這些事情在Perl?總之,我需要能夠做到以下幾點:

  • 啓動外部進程
  • 閱讀STDOUTSTDERR分別
  • 閱讀STDOUTSTDERR字節在任意一個時間數字,而這個過程是運行(即不必等待處理完成)
  • 檢測何時結束處理
  • 獲取進程的退出代碼

在此先感謝您的答案。

+0

我知道我可以做什麼最我想是這樣的: 系統(「命令2>的stderr.txt>標準輸出.TXT &'); ,然後直接讀取文件,而進程正在運行,但我想不出一個簡單的方法,當該過程完成檢測(不涉及解析「PS ......」輸出或東西)或得到它的退出代碼 – jnrbsn 2010-10-03 04:46:17

回答

3

你可以使用Perl的系統調用接口推出自己的解決方案,但它更容易使用的內置模塊IPC :: Open3。至於你的清單:

啓動外部進程:

use IPC::Open3; 
use IO::Handle; 
use strict; 

my $stdout = IO::Handle->new; 
my $stderr = IO::Handle->new; 
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2'); 

閱讀STDOUT和STDERR分別,字節在任意時間數量:

my $line = <$stdout>; 
# Or 
sysread $stderr, my $buffer, 1024; 

檢測時,該過程完成:

use POSIX qw(sys_wait_h); 

waitpid $pid, 0; # Waits for process to terminate 
waitpid $pid, WNOHANG; # Checks if the process has terminated 

獲取進程的退出代碼:

my $status = $?; # After waitpid indicates the process has exited 

請務必閱讀IPC :: Open3文件;正如它警告的那樣,如果你不小心,當你有單獨的stdout和stderr管道時,你很容易陷入僵局。如果子進程罷了要麼管,它會阻止,如果父進程讀取其他管,將阻止。

2

你要這個模塊:IPC::Open3

+0

感謝您向正確的方向推動(這就是我真正需要的)。雖然,我發現這個例子比perldoc更有幫助(並且與我的情況更相關):http://docstore.mik.ua/orelly/perl/prog3/ch32_31.htm – jnrbsn 2010-10-03 05:06:21

1

你想IPC ::運行,它抓住了IO並返回退出值

相關問題