Как я могу проверить, успешно ли загружен файл, и повторить попытку загрузки через скрипт оболочки?

Я запускаю сценарий оболочки, который загружает файл результатов для удаления сервера. Однажды ftp-сервер вышел из строя, но никто не знал об этом, поэтому ежедневные данные не генерируются вовремя.

Чтобы предотвратить эту проблему, мой менеджер попросил меня проверить результат загрузки и попытаться загрузить его с некоторой задержкой. (Попробуйте каждый час 2 ~ 3 раза.)

У меня есть вопросы. 1. Как я могу определить, успешна ли загрузка файла? 2. Как я могу запланировать загрузку файлов иногда?

К вашему сведению, наша система работает на RHEL5 и ниже приведен код загрузки файла.

ftp -n -v ${FTP_HOST} << END_SCRIPT

user ${FTP_USER} ${FTP_PASSWD}

prompt

binary

put  ${REPORT__NAME}.tar.gz

bye

END_SCRIPT

1 ответ

Ленивое (простое, но не очень умное) решение:

  • 1) вычислить сумму MD5 файла: md5sum ZEFILE > ZEFILE-MD5.txt
  • 2) загрузить файл: put ZEFILE

Если вы можете запускать команды на удаленном сервере:

  • 3) сразу за второй командой (поэтому она запускается только после первой): put ZEFILE-MD5.txt
  • 4) на удаленном сервере: он ожидает, пока "ZEFILE" также не получит "ZEFILE-MD5.txt" с ним, показывая, что файл, вероятно, полностью загружен. Затем он сравнивает md5sum ZEFILE с содержимым ZEFILE-MD5.txt и предупреждает вас (почта?), Что ZEFILE "поврежден"

Если у вас нет доступа к удаленному серверу:

  • 3) попробуйте скачать ZEFILE снова под другим именем: get ZEFILE ZEFILE-from-remote
  • 4) diff ZEFILE ZEFILE-from-remote

Я также рекомендую, если у вас есть (некоторые) доступ к удаленному серверу, использовать "scp ZEFILE user@destination:/some/path/" вместо использования FTP.

Если вы вынуждены использовать FTP: читайте об использовании expect вместо написания статического скрипта, который не может "адаптироваться" к удаленно отправленным сообщениям об ошибках (и не ждать правильных подсказок перед выдачей соответствующих команд)

А по поводу перепланирования: man at

Вы могли бы сделать: echo /path/to/myscript | at now + 3 hours (проверьте синтаксис, пожалуйста, пишите по памяти, прочитав эту справочную страницу несколько лет назад...) (скрипт может повторно представить себя таким образом, но остерегайтесь бесконечных циклов ^^)

Я надеюсь, что это поможет (и что кто-то придумает более "умную" идею ^^)

Другие вопросы по тегам