Depois de ler um pouco mais sobre a solução discutida na resposta à pergunta " Por que esse tee está perdendo stdout? ", parece que a mudança crucial está substituindo o pipe com o redirecionamento para um subshell contendo o comando que, de outra forma, estaria sendo canalizado. (Assim, substituindo: command1 | command2
com: command1 > >( command2 )
)
A razão para isto é que redirecionando para um subshell, ao invés de direcionar diretamente para o próximo comando, está-se forçando o subshell a lidar com qualquer EAGAIN
retornaram. Como discutido nesta mensagem no fórum do FreeBSD: bin / 164947: o tee perde dados quando grava em non descritores de arquivo de bloqueio (também vinculados na resposta à outra pergunta) tee
e outros binários do sistema podem ser muito ruins em manipular as próprias tentativas.
Para o comando rsync
acima, as seguintes alterações parecem corrigir meu problema original:
rsync -av -e 'bash -x -c "ssh -p 22 -vvvv $0 $@ 2>/tmp/rsync-ssh.stderr > >( tee /tmp/rsync.stdout )"' --rsync-path='sudo rsync' "[email protected]:/media/remote_volume/" "/media/local_volume"