как получить код возврата команды scp с ошибкой потери соединения в сценарии оболочки

У меня есть сценарий оболочки, в котором я извлекаю файл *.gz удаленного сервера, используя приведенную ниже команду, а после scp я выполняю команду gunzip. Проблема в том, что при выполнении scp соединение теряется, поэтому неполный файл *.gz сохраняется в каталоге моего локального сервера, и когда я пытаюсь распаковать его в следующей строке ниже команды scp, он успешно распаковывает файл, и когда я открываю файл, он содержит мусорные значения.

scp ${HostUser}@${HostServer}:$4/*$no*.gz 
gunzip 

При отладке я обнаружил следующую причину: 1. Неполная передача файла из-за потери соединения. 2. При выполнении команды gunzip вручную она выдавала ошибку «конец файла не найден». Таким образом, он случайным образом создавал значение мусора в файле, и мой скрипт идти к успеху, что неправильно. Итак, мои запросы:

  1. Могу ли я сохранить код возврата команды scp, с помощью которого я могу узнать, была ли выполнена полная передача файла? команда

  2. Я также сталкиваюсь со странной проблемой: при первом запуске команды scp соединение теряется, но когда я снова запускаю команду scp из того же сеанса, она проходит успешно. Но в производстве каждый раз это будет новый сеанс, поэтому мы не можем позволить себе регулярные сбои в работе. Также один конкретный файл, соединение теряется через 5 секунд. Я проверил, что время ожидания сеанса удаленного сервера составляет 5 минут.

пожалуйста, предложите


person Raj Malhotra    schedule 29.08.2014    source источник


Ответы (1)


'$?' будет содержать код выхода последней команды, чтобы вы могли назначить его переменной после команды scp. Затем выполните оператор if, чтобы проверить, что код выхода = 0, для успешного завершения, затем запустите команду gunzip.

scp ${HostUser}@${HostServer}:$4/*$no*.gz 
EXIT_STATUS=$?
if [ $EXIT_STATUS -eq 0 ]; then
   gunzip
else
   ...some error handling
fi
person Steak054    schedule 29.08.2014
comment
здесь приведены коды возврата, так что можно уточнить. Иногда вы не хотите обрабатывать конкретную ошибку. Например, когда просто нет файлов для обработки (код возврата 1). Ошибки потери соединения значительно превышают 1. - person Martin Braun; 10.04.2021