Não vejo por que isso precisa ter algo a ver com o Perl. Quero dizer, você só quer continuar executando o rsync - um aplicativo de linha de comando - se ele falhar. Não seria algo assim suficiente?
while ! rsync -a /mydir myuser@remotehost:/other_dir; do
sleep 180;
done
Explicação
Isso continuará tentando executar o comando rsync
até que seja concluído com êxito (com um código de saída 0). Em cada iteração, ele aguardará 180 segundos antes de continuar. Este é todo o script bash, btw, e será executado sem modificações no seu terminal.
Em perl
Eu nunca escrevi Perl, mas desde que você solicitou uma versão em perl, eu juntei isso usando o Google e o interpretador Perl em poucos minutos ...
my $rsync = 'rsync -a /mydir myuser@remotehost:/other_dir';
while ( system($rsync) == -1 ) {
sleep 180;
}
Salvar como sync.pl
e executar com perl sync.pl
. Claro, substitua o diretório e nomes de host por valores reais.