Отладка 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 играть хорошо с ти в этом сценарии?

1 ответ

Решение

После более подробного изучения решения, обсуждавшегося в ответе на вопрос " Почему этот тройник теряет стандартный вывод?", Похоже, что принципиальное изменение заключается в замене канала перенаправлением на подоболочку, содержащую команду, которая в противном случае передавалась бы по трубопроводу. в. (Таким образом, замена: 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"
Другие вопросы по тегам