Как я могу проверить, успешно ли загружен файл, и повторить попытку загрузки через скрипт оболочки?
Я запускаю сценарий оболочки, который загружает файл результатов для удаления сервера. Однажды 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
(проверьте синтаксис, пожалуйста, пишите по памяти, прочитав эту справочную страницу несколько лет назад...) (скрипт может повторно представить себя таким образом, но остерегайтесь бесконечных циклов ^^)
Я надеюсь, что это поможет (и что кто-то придумает более "умную" идею ^^)