外部コマンドを実行してそれを個別にrtmpdump
読み取りたいのですが、そのようなコマンドが終了するまで待たずに、利用可能な場合は部分的な出力をまとめて読み取ります...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 のバイナリ出力は、印刷ではなく、変数に格納する必要があります。