Ho creato uno script in perl per eseguire programmi con un timeout. Se il programma in esecuzione richiede più tempo allora il timeout rispetto allo script uccide questo programma e restituisce il messaggio "TIMEOUT".Problemi con fork exec kill durante il reindirizzamento dell'output in perl
Lo script ha funzionato abbastanza bene fino a quando ho deciso di reindirizzare l'output del programma eseguito.
Quando lo stderr e lo stderr vengono reindirizzati, il programma eseguito dallo script non viene ucciso perché ha un pid diverso da quello ricevuto dalla forcella.
Sembra che perl esegua una shell che esegue il mio programma in caso di reindirizzamento.
Mi piacerebbe avere il reindirizzamento dell'output ma è comunque possibile interrompere il programma in caso di timeout.
Qualche idea su come potrei farlo?
un codice semplificato del mio script è:
#!/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($?);
Grazie per qualsiasi aiuto.
! Intelligente, pulito e funziona. Tks. – Edu