Estoy escribiendo un script Perl que escribirá algunas entradas y las enviará a un programa externo. Hay una pequeña, pero no nula posibilidad de que este programa va a colgar, y quiero en cuando a cabo:¿Cómo puedo agotar el tiempo de espera de un proceso bifurcado que podría bloquearse?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
Tal como está ahora, después de $ num_secs_to_timeout, program_of_interest aún persiste. Traté de matarlo en la subrutina anónima para $SIG{ALRM}
de la siguiente manera:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
pero esto no hace nada. program_of_interest aún persiste. ¿Cómo voy a matar a este proceso?
Creo que "kill 9, - $ PID" debería ser "kill -9, $ PID". Usé el sistema ("kill -9 $ PID") en su lugar. – Boolean
Creo que "kill -9 $ PID" debería ser "kill -9 $ pid", pero sí, el pid negativo indica matar un grupo de procesos en lugar de solo un proceso. De la documentación de kill: "A diferencia de Shell, si SIGNAL es negativo, mata los grupos de procesos en lugar de los procesos. (En el Sistema V, un número de PROCESO negativo también eliminará los grupos de procesos, pero eso no es portátil)". – simpleuser