Perl(コマンドラインPHPスクリプト)で別のプロセスを実行したいと思います。このプロセスの出力とリターンコードをキャプチャしたいと思います。オプションで、プロセスがN秒より長くかかる場合は、プロセスを終了して先に進むことができるようにしたいと思います。何を調べればいいですか?
6 に答える
2
IPC::Runを試すことができます。
IPC :: Run-system()およびバックグラウンドプロシージャ(配管、redirs、ptys付き)(Unix、Win32)
于 2012-11-26T20:37:13.600 に答える
2
個人的には、AnyEvent :: Util ::run_cmdとタイマーを備えたAnyEventが最も簡単だと思います。ここでは、プログラム全体をイベントループの下で実行する必要はありません。今日、このソリューションを使用して、イベントループに定期的に出入りしています。(以下は警告ではありません-安全です。)
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";
于 2012-11-26T23:44:19.500 に答える
1
piped 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;
于 2012-11-26T20:47:54.033 に答える
1
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], ...)
)をリストすることができ、別のものが検出された場合、キャプチャは例外をスローします。デフォルトでは(キャプチャするためにコマンドだけが渡された場合)、ゼロ以外の終了値は例外になります。
于 2012-11-26T21:08:07.647 に答える
1
これはよくある質問です。このPerlFAQもご覧ください。基本的に、Perlで外部コマンドを実行する方法を説明します。
于 2012-11-27T08:49:33.803 に答える
0
質問のオプション部分を考慮せずに、バッククォート内のコマンドの出力と、特別な変数の戻り値を取得できます$?
。
my $output = `shell_command`;
die ("shell_command failed!\n") if ($?);
于 2021-03-03T10:25:17.393 に答える