Выполнение Rsync system () в Perl случайно завершается с ошибкой протокола - PullRequest
0 голосов
/ 07 декабря 2018

Мы обычно вызываем rsync в (Mod) Perl (и PHP) и не сталкивались с слишком большим количеством проблем, но у нас иногда возникает ошибка протокола при выполнении команды, которая при запуске по последующему запросу проходит нормально,Самое смешное, что даже если я попытаюсь повторить код, для того же http-запроса он будет каждый раз сбиваться, но если вы сделаете еще один http-запрос, он, скорее всего, будет успешным.

Код выглядит следующим образом:

$cmd = sprintf('rsync -auvvv --rsync-path="rsync --log-file=/tmp/ui-rsync.log" %s %s', "$fromDir/$fromBase/", "$path/$toBase/");
$exitCode = system($cmd);

Аргумент --rsync-path был добавлен позже для отладки.Это было бесполезно.Сбой в любом случае.

Ошибки выглядят так:

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]

или примерно так:

unexpected tag 93 [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(1134) [receiver=3.0.6]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]

Я отлаживаю фактические сгенерированные команды и могу их запускатьштрафа от руки.

Пользователь http может нормально выполнять команды.

Опять же, программная повторная попытка никогда не работает, но повторяется вручную (при достижении той же конечной точки httpэто срабатывает), работает почти всегда.

Цените любую помощь, так как это сводит нас с ума в течение ... долгого времени, с множеством исправлений.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Решением было изменить system () на backticks.Шутки в сторону.Я не знаю, почему это работает.

Изменение буквально таково:

# BAD:
$exitCode = system($cmd);
# GOOD:
`$cmd`;

Если бы мне пришлось угадывать, я бы сказал, что есть небольшая разница с инициализацией оболочки, возможно, некоторые переменные окружения или области памяти не очищаются должным образом.Хотя я действительно не знаю.

0 голосов
/ 08 декабря 2018

Если это настоящий heisenbug , вы можете повторить попытку rsync, возможно, три раза, поспав между:

for my $n (1..3){
   my $exitCode = system($cmd);
   my_log_sub("SUCCESS: rsync succeded on try $n") + last if $exitCode==0;
   my_log_sub("ERROR: rsync $n of 3 failed: $cmd $! $?");
   sleep(1) if $n<3;
}

Вы проверили свои локальные и удаленные журналы?Попробуйте sudo ls -rtl /var/log/ или sudo ls -rtl /var/log/httpd/ сразу после сбоя и tail -f /var/log/one_of_the_newest_logs при повторной попытке.

Вы проверили, заполнен ли удаленный диск или каталог существует?Проблема с брандмауэром?Удаленные и локальные версии rsync или ssh (очень) отличаются?(хотя я предполагаю, что должно появиться более четкое сообщение об ошибке)

...