タイムアウトでプログラムを実行するために、perlでスクリプトを作成しました。実行中のプログラムに時間がかかる場合は、スクリプトがこのプログラムを強制終了して「TIMEOUT」というメッセージを返すよりもタイムアウトになります。
実行されたプログラムの出力をリダイレクトすることを決定するまで、スクリプトは非常にうまく機能しました。
stdoutとstderrがリダイレクトされているとき、スクリプトによって実行されたプログラムは、フォークから取得したものとは異なるpidを持っているため、強制終了されません。
perlはリダイレクトの場合に私のプログラムを実行するシェルを実行しているようです。
出力リダイレクトが欲しいのですが、タイムアウトの場合でもプログラムを強制終了できます。
どうすればそれができるかについてのアイデアはありますか?
私のスクリプトの簡略化されたコードは次のとおりです。
#!/usr/bin/perl
use strict;
use warnings;
use POSIX ":sys_wait_h";
my $timeout = 5;
my $cmd = "very_long_program 1>&2 > out.txt";
my $pid = fork();
if( $pid == 0 )
{
exec($cmd) or print STDERR "Couldn't exec '$cmd': $!";
exit(2);
}
my $time = 0;
my $kid = waitpid($pid, WNOHANG);
while ( $kid == 0 )
{
sleep(1);
$time ++;
$kid = waitpid($pid, WNOHANG);
print "Waited $time sec, result $kid\n";
if ($timeout > 0 && $time > $timeout)
{
print "TIMEOUT!\n";
#Kill process
kill 9, $pid;
exit(3);
}
}
if ( $kid == -1)
{
print "Process did not exist\n";
exit(4);
}
print "Process exited with return code $?\n";
exit($?);
助けてくれてありがとう。