我想執行外部命令rtmpdump
並單獨讀取它的STDOUT
和STDERR
,但不要等到這樣的命令結束,而是讀取它的部分輸出, 。無需等待讀取STDOUT和STDERR的外部命令
什麼是安全的方式做到這一點在Perl?
這是一個代碼,我有「每行」的基礎工作:
#!/usr/bin/perl
use warnings;
use strict;
use Symbol;
use IPC::Open3;
use IO::Select;
sub execute {
my($cmd) = @_;
print "[COMMAND]: $cmd\n";
my $pid = open3(my $in, my $out, my $err = gensym(), $cmd);
print "[PID]: $pid\n";
my $sel = new IO::Select;
$sel->add($out, $err);
while(my @fhs = $sel->can_read) {
foreach my $fh (@fhs) {
my $line = <$fh>;
unless(defined $line) {
$sel->remove($fh);
next;
}
if($fh == $out) {
print "[OUTPUT]: $line";
} elsif($fh == $err) {
print "[ERROR] : $line";
} else {
die "[ERROR]: This should never execute!";
}
}
}
waitpid($pid, 0);
}
但上面的代碼工作只在文本模式下,我相信。要使用rtmpdump
作爲命令,我需要以二進制模式收集部分輸出,因此不要像上面的代碼一樣逐行讀取STDOUT
。
STDOUT的二進制輸出應存儲在變量,不打印。
我應該澄清一個問題:除了將STDOUT數據存儲到變量之外,我需要能夠處理這些部分數據,無論何時可用。換句話說,某些功能應該在每次可用時調用新的STDOUT數據。 –
@Ωmega用sub ref –
替換'\ $ out_buf'就像@mpapec所說的,按照STDERR的例子。 – ikegami