Назад | Перейти на главную страницу

Отладка rsync через SSH в подробном режиме с использованием tee для перенаправления stdout в файл журнала

У меня были проблемы с различными операциями rsync через SSH на конкретном компьютере в нашей сети, с ошибками и такими ошибками, как:

rsync: connection unexpectedly closed (45482 bytes received so far)  [generator]

Нашел похожий пост (rsync - необъяснимая ошибка), для которого в одном из ответов предлагалось запустить команду SSH, используемую rsync, в подробном режиме и перенаправить вывод, в моем случае следующим образом:

rsync -av -e 'bash -x -c "ssh -p 22 -vvvv $0 $@ 2>/tmp/rsync-ssh.stderr | tee /tmp/rsync.stdout"' --rsync-path='sudo rsync' "backup_user@10.0.0.2:/media/remote_volume/" "/media/local_volume"

Эта команда rsync какое-то время работает нормально, но в конечном итоге выдает ошибку:

tee: standard output: Resource temporarily unavailable

Я предполагаю, что это, скорее всего, не работает по той же причине, что описана в ответе на следующий вопрос: Почему эта футболка проигрывает стандартному выходу? Однако мне не совсем понятно, как мне изменить команду SSH в моем случае, чтобы решить проблему.

Кто-нибудь знает, как заставить SSH хорошо играть с тройником в этом сценарии?

Прочитав немного больше о решении, обсуждаемом в ответе на вопрос "Почему эта футболка проигрывает стандартному выходу?", похоже, что решающее изменение заключается в замене канала перенаправлением на подоболочку, содержащую команду, которая в противном случае передавалась бы по конвейеру. (Таким образом, замена: command1 | command2 с участием: command1 > >( command2 ))

Причина этого в том, что путем перенаправления на подоболочку вместо прямого перехода к следующей команде вы заставляете подоболочку обрабатывать любые EAGAIN коды ошибок вернулся. Как обсуждалось в этом сообщении доски объявлений FreeBSD: bin / 164947: tee теряет данные при записи в неблокирующие файловые дескрипторы (также ссылка на ответ на другой вопрос) tee и другие системные двоичные файлы могут плохо справляться с повторными попытками.

Для rsync приведенную выше команду, следующие изменения, похоже, исправят мою исходную проблему:

rsync -av -e 'bash -x -c "ssh -p 22 -vvvv $0 $@ 2>/tmp/rsync-ssh.stderr > >( tee /tmp/rsync.stdout )"' --rsync-path='sudo rsync' "backup_user@10.0.0.2:/media/remote_volume/" "/media/local_volume"