Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^2: Net::OpenSSH reconnect master if conn. closed

by Bolemo (Acolyte)
on Sep 27, 2020 at 12:38 UTC ( #11122263=note: print w/replies, xml ) Need Help??


in reply to Re: Net::OpenSSH reconnect master if conn. closed
in thread Net::OpenSSH reconnect master if conn. closed

Interesting! Thank you.

I will keep that in mind. I will first experiment with a simple $ssh->check_master

Letís say that I created a master connection this way: my $ssh = Net::OpenSSH->new(...);

Before calling a slave ssh command with open3 or capture, I will test $ssh to check if it is still connected or not, like:
$ssh = Net::OpenSSH->new(...) unless ($ssh->check_master); $ssh->capture(...);

I will see how light or heavy on CPU this check_master function is.
EDIT: no errors and the script works fine. Killed the ssh process on the remote device to test and...
The script works, but not as expected. Seems that an ssh connection is recreated allowing the slave command to be run, but there is no more master ssh connection sticking. After first disconnect event, it reconnects each time instead of staying connected like the first time.

Replies are listed 'Best First'.
Re^3: Net::OpenSSH reconnect master if conn. closed
by salva (Canon) on Sep 28, 2020 at 15:54 UTC
    I have added a new restart method for reestablishing the connection to the server in Net::OpenSSH version 0.80. It is something that should have been available a long time ago, but at first it was difficult to implement, then at some point I had to revamp the code managing the master process in order to fix several others bugs making it trivial but didn't though about adding it... until I read your post today!

    Note that it is possible that a broken connection goes unnoticed until you actually try to use it. wait_for_master cheeks the local ssh master process but some kind of errors (for instance, a broken TCP connection), would go unnoticed. So to be sure you cover all the cases, you need to try running the command and if that fails, reconnect:

    my $cmd = "..."; my $out = $ssh->capture({timeout => 120}, $cmd); unless (defined $out) { warn "unable to run command $cmd, retrying..."; $ssh->restart or die "Unable to restart SSH connection: " . $ssh->er +ror; $out = $ssh->capture({timeout => 120}, $cmd); unless (defined $out) { die "definitively, I can't run the command $cmd: " . $ssh->error; } }
    If $cmd does some non-atomic operation, it is a long running operation you don't want to run twice, etc., you may like to use a harmless dummy command as "echo hello" instead.
      That is great, thank you!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11122263]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2021-05-15 21:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Perl 7 will be out ...





    Results (150 votes). Check out past polls.

    Notices?