Página 1 de 1

Problema con módulo Net::Rsh con control flujo por timeout

NotaPublicado: 2008-12-12 10:04 @461
por mjimenez
Hola, tengo un grave problema de control de flujo, resulta que no tengo control en Perl sobre el módulo de RSH, así que cuando hago un rsh a una máquina remota, y ésta a su vez tiene el servicio mal, no me da la posibilidad de hacer un timeout y proseguir por ejemplo con la siguiente máquina si tuviese un listado de maquinas para hacer diversas conexiones...

Este es el código, a ver si alguien pudiese echarle un vistazo, gracias:

Script original (cortado, solo dejo lo interesante, el control del flujo)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Net::Ping;
use Net::Ifconfig::Wrapper;
use Net::Rsh;

... ...

PropagateStatus(@NodeList,$ProxyNo);
sub PropagateStatus {

    local *listnodes=@_[0];

    # Set remote status files to itself as the MasterProgram
    local $command = "echo " .$_[1] ." > " .$status_file;
    local $rsh_connection=Net::Rsh->new();
    foreach (@listnodes) {
        chomp($_);
        print "RSH access to " ."-$username\@$_- \n";
        print "Executing: $command at remote host\n";
        @tmp=$rsh_connection->rsh($_,$username,$username,$command);
    }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Hace una conexión rsh al primer nodo disponible pero si falla no es capaz de seguir con el siguiente nodo del array nodelist.
Aquí he encontrado una posible solución, ¿podríais echarle un ojo para revisar si está correcto? ¿o si disponéis de alguna otra posible solución?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
local $rsh_connection=Net::Rsh->new();
foreach (@listnodes) {
    $SIG{ALRM} = \&temporizador;
    $time=10;
    eval {
        alarm($time);

        chomp($_);
        print "RSH access to " ."-$username\@$_- \n";
        print "Executing: $command at remote host\n";
        @tmp=$rsh_connection->rsh($_,$username,$username,$command);
    }
}

alarm(0);
};
if ($@ =~ /End of timer/) {
    print "Returns timer code\n";
}
else {
    print "Returns no code: $res\n";
}

sub temporizador {
    # how its added
    die "Timeup of timer";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Gracias, un saludo.

NotaPublicado: 2008-12-12 18:31 @813
por explorer
Bienvenido a los foros de Perl en Español, mjimenez.

Yo creo que sí. Leyendo al principio tu mensaje, lo primero que pensé fue en la posibilidad del alarm().

Pero también hay cosas interesantes, como el programa slrsh, que ejecuta comandos en varias máquinas, incluso a la vez.