2010-10-03 137 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并返回退出值

相关问题