[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