Perl で実行したいコマンド ライン関数があります。ただし、最大 X 秒間実行したいだけです。X 秒で結果が返されない場合は、先に進みます。たとえば、次のようなことをしたい場合
sub timedFunction {
my $result = `df -h`;
return $result;
}
3 秒経過しても値が返されない場合、コマンド ライン コマンドが終了するまでの待機を強制終了するにはどうすればよいですか?
Perl で実行したいコマンド ライン関数があります。ただし、最大 X 秒間実行したいだけです。X 秒で結果が返されない場合は、先に進みます。たとえば、次のようなことをしたい場合
sub timedFunction {
my $result = `df -h`;
return $result;
}
3 秒経過しても値が返されない場合、コマンド ライン コマンドが終了するまでの待機を強制終了するにはどうすればよいですか?
アラームを使用したい。
local $SIG{ALRM} = sub { die "Alarm caught. Do stuff\n" };
#set timeout
my $timeout = 5;
alarm($timeout);
# some command that might take time to finish,
system("sleep", "6");
# You may or may not want to turn the alarm off
# I'm canceling the alarm here
alarm(0);
print "See ya\n";
アラーム信号がキャッチされたときに、ここで「死ぬ」必要はありません。呼び出したコマンドのpidを取得して、それを強制終了するとします。
上記の例の出力は次のとおりです。
$ perl test.pl
Alarm caught. Do stuff
$
システム コールの後に print ステートメントが実行されていないことに注意してください。
perldocによると、「eval/die」のペアでない限り、alarm を使用してシステム コールをタイムアウトにすることは推奨されないことに注意してください。