Utworzono skrypt w perlu, aby uruchamiać programy z limitem czasu. Jeśli wykonywany program zabiera więcej czasu niż skrypt, ten program jest zwalniany i zwraca komunikat "TIMEOUT".Problem z kill exec kill podczas przekierowywania wyjścia w perl
Scenariusz działał całkiem dobrze, dopóki nie zdecydowałem się przekierować wyjścia z wykonanego programu.
Kiedy standardowe i stderr są przekierowywane, program wykonywany przez skrypt nie jest zabijany, ponieważ ma pid inny niż ten, który otrzymałem z widelca.
Wygląda na to, że perl wykonuje powłokę, która wykonuje mój program w przypadku przekierowania.
Chciałbym mieć przekierowanie wyjścia, ale nadal będę w stanie zabić program w przypadku przekroczenia limitu czasu.
Jakieś pomysły na to, w jaki sposób mogę to zrobić?
Uproszczony kod mojego skryptu jest:
#!/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($?);
Dzięki za wszelką pomoc.
! Sprytnie, czysto i działa. Tks. – Edu