Mi script Perl ejecuta un programa externo (que toma un solo parámetro de línea de comandos) y procesa su resultado. Originalmente, yo estaba haciendo esto:Kill a niño colgado proceso
my @result = `prog arg`;
Sin embargo, resulta que el programa está libre de errores y se cuelga de forma impredecible en casos raros. ¿Cómo puedo matar el programa si no ha salido después de una cierta cantidad de tiempo? La secuencia de comandos debe funcionar tanto en Windows como en Linux, y entiendo que las alarmas y las horquillas no funcionan bien (o no funcionan) en Windows.
Encontré un módulo llamado IPC::Run pero no puedo encontrar la forma de usarlo correctamente desde su documentación. :-(He intentado esto:
use strict;
use warnings;
use IPC::Run qw(run timeout);
my $in;
my $out;
my $err;
my @result;
my @cmd = qw(prog arg);
run \@cmd, \$in, \$out, \$err, timeout (10) or die "@cmd: $?";
push @result, $_ while (<$out>);
close $out;
print @result;
Como prueba, he creado un programa que solo duerme 60 segundos, imprime una cadena a stdout
y salidas Cuando intento funcionar con el código anterior, se cuelga para. 60 segundos (en lugar de 10 segundos, según se especifica en el tiempo de espera) y aborta con un error extraño:
IPC::Run: timeout on timer #1 at C:/Bin/Unix/Perl/site/lib/IPC/Run.pm line 2956
Entonces me encontré con otro módulo, Proc::Reliable por la descripción, parece que hacer precisamente lo que quiero.. ¡Excepto que no funciona! Intenté esto:
use strict;
use warnings;
use Proc::Reliable;
my $proc = Proc::Reliable->new();
$proc->maxtime (10);
my $out = $proc->run ("prog arg");
print "$out\n";
De hecho, aborta el proceso secundario después de 10 segundos. Hasta aquí todo bien. Pero luego modifiqué el programa externo y lo hice dormir por solo 5 segundos. Esto significa que el programa debe finalizar antes del tiempo de espera de 10 segundos especificado en el código anterior y su salida stdout
debe capturarse en la variable $out
. ¡Pero no lo es! La secuencia de comandos anterior no muestra nada.
¿Alguna idea de cómo hacerlo correctamente? (Reparar el error del programa externo no es una opción.) Gracias de antemano.
¿Ha intentado imprimir la salida desde stderr, estado y msg desde el objeto confiable? – Nick
¿Qué sucede cuando configura depuración? 'Proc :: Reliable :: debug ($ level);' – DVK
Si hago 'Proc :: Reliable :: debug (1);', la secuencia de comandos solo genera 'Proc :: Reliable> ATTEMPT 0: 'prog arg'' y nada más. Sin salida de '$ out'. (Por supuesto, si ejecuto el programa 'prog arg' manualmente, obtendré la salida.) – Vess