I'm not sure at the moment if there's a built-in way to do this. But here is a stripped-down version of a script I've had in active use for about a year now to maintain a connection to an SSH server:
use warnings;
use strict;
use Net::OpenSSH;
my $connect_interval_s = 60;
my $command_interval_s = 60;
my $run=1;
local $SIG{INT} = sub { $run=0 };
local $SIG{TERM} = sub { $run=0 };
OUTER: while ($run) {
my $ssh;
eval {
$ssh = Net::OpenSSH->new( 'hostname', user => 'username',
timeout => 10, kill_ssh_on_timeout => 1,
) or die "Failed to set up SSH";
die "SSH failed to connect: ".$ssh->error if $ssh->error;
;1} or do {
warn "Connect failed, will retry: $@";
sleep $connect_interval_s if $run;
redo OUTER;
};
# connection is up
INNER: while ($run) {
eval {
my $rv = $ssh->capture('echo some command');
die "Remote command failed: ".$ssh->error if $ssh->error;
# ... do something with $rv here ...
;1} or do {
warn "Command failed, will attempt to reconnect: $@";
last INNER;
};
sleep $command_interval_s if $run;
}
sleep $connect_interval_s if $run;
}
In addition, I've got this in my ~/.ssh/config for that hostname:
Host hostname
User username
IdentityFile ~/.ssh/filename
ConnectTimeout 10
ServerAliveInterval 10
ServerAliveCountMax 3
ExitOnForwardFailure yes