[bcn-pm] timeout que no em mata el procés
Arnau Bria
listsarnau a gmail.com
dim mar 20 09:22:11 PDT 2012
On Thu, 15 Mar 2012 11:39:06 +0100
Alex Muntada wrote:
> + Arnau Bria <listsarnau a gmail.com>:
Lo primer dir que el meory leak es produia perls N (sent N un nombre
elevat) processos zombies que generava... Per tant, el tema variable i
tal no ha estat preocupant (ocupa uns 150 MB però tin un hash de 60/80
MB).
[...]
> El meu consell és que miris de crear els fills des del propi Perl,
> que guardis els PID i que aleshores els matis com cal i els hi
> facis un wait perquè no siguin zombies.
he seguit el teu consell i tinc quelcom millor, tot i que no acabo de
trobar el que jo vull exactament, per això torno aquí.
He mirat N links :
desde com fer el fork:
http://docstore.mik.ua/orelly/perl/learn/ch14_04.htm
al que m'interessa: timeout (eval) sobre forks:
http://stackoverflow.com/questions/1962985/how-can-i-timeout-a-forked-process-that-might-hang
http://www.perlmonks.org/?node_id=843610
http://www.mail-archive.com/beginners@perl.org/msg81677.html
http://www.trevorbowen.com/tag/timeout/
El meu codi, tret del codi del dimoni per fer-lo més simple, queda
algo com:
while (1) {
if (!defined($kidpid = fork())) {
# El fork falla
die "cannot fork: $!";
} elsif ($kidpid == 0) {
# fillet
setpgrp(0,0); # creo un nou process group
exec("$command >/tmp/command");
die "can't exec $command: $!";
exit (0); #el fill aqui marxa
} else {
# Papito
eval {
local $SIG{ALRM} = sub {kill 'TERM' => -$kidpid;waitpid
($kidpid,0);die "Timeout\n" };
alarm 5;
waitpid($kidpid, 0);
alarm 0;
};
if ($@) {
# He donat timeout
print "$kidpid timeout\n";
}else{
#he executat be
print "ole tu\n";
};
}
sleep 20;
};
Aquest codi em fucniona si la comanda és un sleep major que el timeout.
Però si canvio a la meva comanda original, estic veient que quan
intento matar tots els processos fills (kill 'TERM' => -$kidpid) el
waitpid s'espera fins que la meva comanda dona timeout ella mateixa. És
a dir, que no estic matant el procés, sinó que només faig el waitpid
(que ja és més correcte del que feia fins ara). Si llenço la comanda
($command) a mà la puc matar fent un simple Ctrl+C, per tant crec que
ara tinc un problema enviant les senyals.
que no faig bé amb el kill ?
Moltes gràcies per endavant, com sempre!
Arnau
Més informació sobre la llista de correu Barcelona-pm