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

Carles Fenoy minibit a gmail.com
dim mar 20 09:35:12 PDT 2012


Hola,

Has provat d'enviar SIGINT enlloc de SIGTERM? Ctrl+C envia SIGINT i
potser la teva comanda captura SIGTERM.

Salutacions
Carles Fenoy

2012/3/20 Arnau Bria <listsarnau a gmail.com>:
> 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
> _______________________________________________
> llista dels Barcelona-pm
> Barcelona-pm a pm.org
> http://mail.pm.org/mailman/listinfo/barcelona-pm
> BCN Perl Mongers: http://barcelona.pm.org



-- 
--
Carles Fenoy


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