Na sua linha de comando, o rsync não está falando diretamente do TCP, está confiando no ssh para a transmissão.
Você pode usar:
RSYNC_RSH='ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -o ServerAliveCountMax=2' rsync ...
Estou usando o rsync em meu próprio programa C ++, emitindo o comando system("rsync -rauzvq root@host:/folder");
Eu uso isso para manter vários sistemas em sincronia.
Agora eu tenho o problema que quando um host remoto é desligado e lá ainda está rsync-ing com o meu programa, meu programa trava para o período de tempo limite do TCP. Então eu pensei, eu ajustaria o parâmetro TCP timeout para o soquete rsync, mas não consigo descobrir como (o --sockopts não está funcionando).
Outra maneira de corrigir isso envolve fazer uma chamada de sistema bifurcada e verificar se o pid de rsync ainda existe após um determinado tempo limite, caso contrário, mate-o. A única desvantagem disso é que eu não posso verificar se o processo está realmente sincronizando ou apenas pendurado em um tempo limite de TCP?
Então, o que vocês tentariam?