Как я могу возобновить загрузку в Perl? - PullRequest
4 голосов
/ 21 марта 2010

У меня есть проект, который зависит от некоторых других двоичных файлов, загружаемых из Интернета во время установки. Для этого я делаю следующее:

if ( file-present-in-src/)
    # skip that file
else
    # use wget to download the file

Проблема с этим подходом заключается в том, что когда я прерываю загрузкупосередине, и в следующий раз вызовите скрипт, частично загруженный файл также пропускается (что нежелательно), также я хочу, чтобы wget возобновил загрузку частично загруженного файла.

Как мне поступитьэто: Возможные решения, о которых я мог подумать:

  1. Позвольте файлу для загрузки в какой-нибудь файл сказать download_tmp.В случае успеха перейдите к исходному файлу.
  2. Обработайте SIG {'INT'} для написания правильного кода очистки.

Но ни один из них не может помочь возобновить частичную загрузку файла,

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 21 марта 2010

Кулак, я не понимаю, какое это имеет отношение к Perl, так как вы используете wget для загрузки ... Вы можете использовать libwww-perl (perldoc LWP) и иметь больший контроль над процессом загрузки.

Затем я подкрепляю вашу идею загрузки в имя файла "tmp" и перемещаю файл в случае успеха.

Однако я думаю, что вам нужно пойти дальше и проверить целостность файлов.Сделать хеш MD5 или SHA очень легко, и сопоставьте загруженный с тем, что вы ожидаете.У вас может быть короткий файл на сервере, содержащий контрольную сумму (filename.md5).Определите успех только тогда, когда у вас есть совпадение.

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

Наконец выне говорите нам, какие бинарные файлы вы скачиваете и что вы делаете с ними.Поскольку вы используете wget, я предполагаю, что вы работаете в Unix;Вы должны рассмотреть возможность использования RPM + Yum или лайков, они обрабатывают все это для вас.RPM легко написать, на самом деле.

1 голос
/ 21 марта 2010

Вы можете просто использовать опции wget -N и -c и удалить всю логику "если файл существует".

1 голос
/ 21 марта 2010

используйте ваш первый подход ..

  1. загрузить в "FileName" .tmp
  2. переместить "FileName" .tmp в "FileName"
    переместить! не копировать
  3. один раз в день очищайте все .tmp файлы (paranoia rulez)
...