[bcn-pm] timeout que no em mata el procés

Alex Muntada alexm a alexm.org
dij mar 15 03:39:06 PDT 2012


+ Arnau Bria <listsarnau a gmail.com>:

> La primera és que tinc un timeout que em crida un procés (que
> acostuma donar timeouts), però no el mata. Es queda en defunct
> fins que reinicio el meu dimoni:

Això és perquè mates el pare dels processos fills i aleshores ningú
fa el wait corresponent. Fer un killall -9 a sac té conseqüències ;-)

> El codi és
>       my $command="diagnose \-f \-\-host=$conf->{maui_server}";
>       my @diagnose;
>       eval {
>                local $SIG{ALRM} = sub { `killall -9 diagnose`; die
> "Timeout\n" }; alarm 5;
>                @diagnose=`$command`;
>                alarm 0;
>        };

Com que estàs barrejant codi Perl amb shell, et serà difícil
gestionar correctament els fills i no podràs evitar els defuncts.

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.

> Com puc fer per matar el procés que m'obre el meu script?

El procés ja està mort però no enterrat (zombie o defunct).
Al perlipc parla de com gestionar-los però només funciona
si els has parit des de Perl, clar:

http://perldoc.perl.org/perlipc.html#Signals

L'alternativa és plantejar-te si et cal crear fills (depèn de la feina
que hagis de fer) o utilitzar un framework d'esdeveniments com
AnyEvent. Però ja t'aviso que això és tot un món en sí mateix.

> Com puc veure la memòria consumida per les meves variables ?
> Em dona la sensació que no estic buidant bé algun hash / array i
> que va aganat dades i dades fins que el meu procés consumeix
> 600MB

Devel::Size és per això i és trivial d'utilitzar.

Salut!

-- 
Alex Muntada <alexm a alexm.org>
http://alexm.org/


Més informació sobre la llista de correu Barcelona-pm