Hola que tal, me bienaventuro en este foro con un grave problema de control de flujo, resulta que no tengo control en Perl sobre el modulo de RSH, asi que cuando hago un rsh a una maquina remota, y esta a su vez tiene el servicio mal, no me da la posibilidad de hacer un timeout y proseguir por ejemplo con la siguiente maquina si tuviese un listado de maquinas para hacer diversas conexiones...
Este es el codigo, a ver si alguien pudiese echarle un vistazo, gracias:
Script original (cortado, solo dejo lo interesante, el control del flujo)
[...]
#!/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);
}
}
Hace una conexion rsh al primer nodo disponible pero si falla no es capaz de seguir con el siguiente nodo del array nodelist.
Aqui he encontrado una posible solucion, podriais echarle un ojo para revisar si esta correcto? o si disponeis de alguna otra posible solucion?
....
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";
}
Gracias por todo!