Я создал скрипт на Perl для запуска программ с таймаутом. Если выполнение программы занимает больше времени, чем тайм-аут, чем сценарий убивает эту программу и возвращает сообщение «ВРЕМЯ».
Сценарий работал довольно хорошо, пока я не решил перенаправить вывод выполненной программы.
Когда перенаправляются stdout и stderr, программа, выполняемая сценарием, не уничтожается, поскольку у нее pid, отличный от того, который я получил от fork.
Кажется, 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($?);
Спасибо за любую помощь.