Почему затыкается wget? (И где может быть причина?)

Модератор: /dev/random

Ответить
MiK13
Сообщения: 1164
ОС: Linux Debian

Почему затыкается wget?

Сообщение MiK13 »

Возможно, вопрос не для этого раздела (м.б. для раздела Программирование, но вопрос о стандартной программе.

Обнаружил на местном сервере (не у провайдера, но у него с ним пиринг, поэтому. вроде бы, бесплатно) образы DVD Lenny. Решил скачать.
Вечером закинул их список wget'у. Думал, за ночь скачается пара дисков -- может быть получится иксы на работе на Geode LX поставить.
Но wget скачал 300 МБ (318707458 байт) первого диска и застрял. Через какое-то время прервал попытку по тайм-ауту и начал вторую. Опять тайм-аут. Через 15 минут предпринял 3-ю попытку, но она и следующие 17 быстро закончились с сообщением:

Код: Выделить всё

Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 4698322944 (4,4G) [application/octet-stream]
debian-500-i386-DVD-1.iso вырвался в действительность.
Повтор.

И начал скачиваться образ 2-го диска. С ним повторилась аналогичная ситуация, но уже после скачивания 3604872506 байтов, т.е. около 3.5 ГБ. Что будет с образом 3-го диска, пока не знаю.
Пытался отдельно продолжить 1-й диск командой wget -c http://...-1.iso. Не хочет.
Команда wget http://...-1.iso начинает запускается сразу -- в файл [b]debian-500-i386-DVD-1.iso.1. А wget -c ... -- не хочет.
Запустил wget -c ... в другом каталоге -- запустился. Прервал, запустил опять -- продолжил.
Попытки продолжить "застрявший" файл заканчиваютсся тайм-аутом.
Из того, что файл с начала качается (и продолжается) впечатление, что причина может быть не у меня, а на сервере, Но какая?
И что может означать сообщение "вырвался в действительность"?
Спрашивал у google и у ya.ru -- нашёл только сслылки на предмет анекдота перевода. В том числе и на этом форуме 2 года назад. С рекомендацией "пльзоваться оригинальной версией". Не очень серьёзной, потому, что это сообщение не в самом wget'е, а в файле /usr/share/locale/ru/LC_MESSAGES/wget.mo
Решил поискать оригинальное сообщение и где и по какой причине оно выдаётся.
В исходниках wget'а, в файле src/http.c (и src/ftp.c) нашёл:

Код:

/* Open the local file. */ if (!output_stream) { mkalldirs (hs->local_file); if (opt.backups) rotate_backups (hs->local_file); if (hs->restval) fp = fopen (hs->local_file, "ab"); else if (ALLOW_CLOBBER) fp = fopen (hs->local_file, "wb"); else { fp = fopen_excl (hs->local_file, true); if (!fp && errno == EEXIST) { /* We cannot just invent a new name and use it (which is what functions like unique_create typically do) because we told the user we'd use this name. Instead, return and retry the download. */ logprintf (LOG_NOTQUIET, _("%s has sprung into existence.\n"), hs->local_file); CLOSE_INVALIDATE (sock); return FOPEN_EXCL_ERR; } } if (!fp) { logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file, strerror (errno)); CLOSE_INVALIDATE (sock); return FOPENERR; } } else fp = output_stream;

От текста has sprung into existence понятней не стало.
Посмотрев код, я пришёл к выводу, что это сообщение возникает, когда wget пытается открыть файл по open и с флагами
O_WRONLY | O_CREAT | O_EXCL
а файл уже существует. Таким образом, причинм может быть всё-таки не в сервере.
Но почему такое может быть у именно этой программы?

P.S. Ситуация возникла второй раз. Первый раз файл в (примерно) 80 МБ застрял после скачивания 60 с небольшим МБ. Причём, wget с нуля его качал, а продолжать не хотел. На следующий день я на работе с того же сервера докачал этот же файл.
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: Почему затыкается wget?

Сообщение Mage-Warrior »

Найдена возможная причина поиском англоязычной версии сообщения в google. В целом звучит и выглядит как:
Apache not serving from CIFS-mounted share, works if it's mounted as SMBFS
На серверной стороне проблема.
Предложенное решение - в httpd.conf на сервере вписать/исправить:

Код: Выделить всё

EnableSendfile off


Пожалуйста ;)
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian
Контактная информация:

Re: Почему затыкается wget?

Сообщение rm_ »

MiK13
А на какую ФС сохраняете файл wget'ом?
Попробуйте качать не им, а с помощью aria2.

Mage-Warrior
Не всегда применимое решение.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Почему затыкается wget?

Сообщение MiK13 »

Сейчас посмотрел -- 3-й диск скачался нормально (md5sum совпала).

Mage-Warrior писал(а):
24.02.2009 08:34
Предложенное решение - в httpd.conf на сервере вписать/исправить:

Код: Выделить всё

EnableSendfile off

В данном случае это не подходит, т.к. сервер не у провайдера (где есть знакомый программист), а у другой организации, с которой у провайдера пиринг.
Но за предложение спасибо -- учту, если самому придётся настраивать web-сервер (только сначала постараюсь понять, что значит "выключить разрешение_передачи_файла")

rm_ писал(а):
24.02.2009 08:38
MiK13
А на какую ФС сохраняете файл wget'ом?

Сохраняю на обычный раздел, размеченный как ext3.
rm_ писал(а):
24.02.2009 08:38
Попробуйте качать не им, а с помощью aria2.

Спасибо, поставил aria и aria2. Запустил aria2c -c -- он начал продолжать качать файл. Причём параллельно в 5 потоков (как обычно, читая первый раз man aria2c не обратил внимания на -j и -s)
На мой взгляд, некоторый недостаток многопоточного скачивания -- нельзя прервать и потом продолжить (или то, что скачано, фиксируется в файле FILE.aria2 и поэтому продолжение возможно даже при аварийном выключении компьютера?)
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian
Контактная информация:

Re: Почему затыкается wget?

Сообщение rm_ »

Но за предложение спасибо -- учту, если самому придётся настраивать web-сервер (только сначала постараюсь понять, что значит "выключить разрешение_передачи_файла")

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

На мой взгляд, некоторый недостаток многопоточного скачивания -- нельзя прервать и потом продолжить (или то, что скачано, фиксируется в файле FILE.aria2 и поэтому продолжение возможно даже при аварийном выключении компьютера?)

При аварийном не знаю, но вообще - aria2 очень умная, и легко продолжает свои многопоточные закачки. По Ctrl-C её прерывать и потом продолжать - можно.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему затыкается wget?

Сообщение /dev/random »

Можно ссылку на проблемный файл? Если, конечно, сервер доступен из внешнего интернета.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Почему затыкается wget?

Сообщение MiK13 »

/dev/random писал(а):
24.02.2009 12:19
Можно ссылку на проблемный файл? Если, конечно, сервер доступен из внешнего интернета.

Сервер http://ftp.mgts.by, из внешней сети доступен. Более того, netinst из Lenny предложил ставить систему именно с него (а также, с linux.org.by).
А вот что касается проблемного файла... трудно сказать. В данный момент я закачиваю образы с http://ftp.mgts.by/debian-cd/5.0.0/i386/iso-dvd/. Когда заткнулся 1-й диск, длина файла была 318707458. 2-й диск -- 3604872506. 3-й диск скачался полностью (4697597952). 4-й я прервал после 2238868402, т.к. мне сейчас очень нужен 1-й, который докачиваю через aria2c.
Но на счёт стабильности проблемы не уверен -- один раз файл заткнулся (остановился вывод tail -f wget-log) и не хотел продолжаться (хотя с начала качался). Но это было дома. А на работе этот же файл wget докачать смог.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Почему затыкается wget?

Сообщение MiK13 »

aria2c помог, но не до конца. Обзар 1-го диска так и не удалось докачать. Вот дамп (восьмеричный) файла debian-500-i386-DVD-1.iso.aria2:

Код: Выделить всё

0000000 000 000 000 000 000 000 000 000 000 000 000 000 020 000 000 270
0000020 012 030 001 000 000 000 000 000 000 000 000 000 000 000 061 002
0000040 000 000 377 377 377 377 377 377 377 377 377 377 377 377 377 377
0000060 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377
0000100 377 377 377 377 377 377 377 376 377 377 377 376 377 377 377 377
0000120 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377
*
0001120 377 377 200 002 000 000 000 057 001 000 000 000 000 020 000 010
0001140 000 000 000 377 377 377 377 377 377 377 360 117 001 000 000 000
0001160 000 020 000 010 000 000 000 377 377 377 377 377 377 300 000
0001177

Я его формат пока не знаю, но похоже что он не смог докачать 2 куска. Впечатление, что на сервере в этом месте bad-блоки.
Или (один знакомый подсказал) -- стоит какой-то антивирусный фильтр, который последовательность байтов в этом месте считает вирусом и не пропускает. Правда, это довольно странное предполозжение.

Попробовал докачать этот файл с основного официального сервера -- и тоже не получилось. Правда, один сегмент, вроде, докачался, а вот второй -- нет :(

Правда, не знаю, на сколько это серьёзно. Смонтировал этот образ и проверил контролльные суммы файлов:

Код: Выделить всё

dk4:/Install/Linux/Debian/Lenny/2/deb# md5sum -c md5sum.txt | grep -v Успех
./pool/main/p/python-kde3/python-kde3_3.16.1-1_i386.deb: НЕУСПЕШНО
md5sum: ПРЕДУПРЕЖДЕНИЕ: НЕ совпали 1 вычисленные контрольные суммы из 6122
dk4:/Install/Linux/Debian/Lenny/2/deb#

Вроде, плохой только один файл, без которого, скорее всего, обойдусь.
Кстати, нет ли возможности заставить работать md5sum как раньше -- чтобы в случае успеха она ничего не выдавала? А то приходится фильтровать эти строки grep'ом.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Почему затыкается wget?

Сообщение MiK13 »

Восстановил диск. md5sum совпала. sha1sum тоже. Но это уже к теме не относится.
А по теме. Причину, по которой wget не хотел продолжать скачивать диски (1-й и 2-й, 3-й, 4-й и 5-й скачались без проблем) я пока так и не нашёл. И впечатление такое, что она не на стороне сервера, а где-то по середине. Т.е. какбудто где-то в районе моего провайдера стоит какой-то фильтр, который не пропускает определённые блоки. Хотя это предположение уже из области паранои.
Но несколько попыток продолжить скачивание 2-го диска ни к чему не привели -- тайм-аут. Причём, как с минского сервера, так и с тех, что указаны на debian.org.
Принёс этот файл (примерно 3.6 ГБ) на работу, дал команду wget'у продолжить качать этот же файл (с того же минского сервера) и он за 3 с четвертью часа потихоньку увеличил его размер на 17,5 МБ. Т.е. никаких проблем не возникло.
Принём файл с добавкой домой. Выдал команду
wget -c http://ftp.mgts.by/pub/debian-cd/5.0.0/i38...-i386-DVD-2.iso
сначала на исходный файл -- никакой реакции, т.е.

Код: Выделить всё

Распознаётся ftp.mgts.by... 86.57.151.3
Устанавливается соединение с ftp.mgts.by|86.57.151.3|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ...
и всё. (только что проверил -- тоже самое).
Выдал эту же команду на увеличенный на работе файл -- тут же пошла закачка. И примерно за полтора часа оставшийся гигабайт был скачан. md5sum скачаного файла совпала со значением в файле MD5SUMS.
Но гипотеза с фильтром, который не пропускает опеделённые данные всё-таки не проходит.
В первом файле бракованый блок попался на файл python-kde3_3.16.1-1_i386.deb. Но сам этот файл (с помощью которого я и восстановил 1-й диск) скачался без проблем.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Почему затыкается wget?

Сообщение MiK13 »

Решил возобновить тему. Т.к. проблему, хотя и удалось обойти, решить не получилось.
Сначал внровь проявилась при скачивании ДОМА 1-го диска Lenny (уже версии 501). Скачалось около 1.2 Гб и дальше не идёт. На работе продолжение пошло нормально. Скачал около 40 Мб, пришёл домой -- дальше всё скачалось без проблкм. Как и диски со 2 по 5-й.
Потом решил поскачивать песни Александра Петровича Ткачева с music.lib.ru. В основном всё было нормально. Но одна песня скачиваться не захотела -- wget получает 1222 байта и всё. Продолжать не хочет. Хотя с начала эти 1222 байта скачивает.
Увидел в Аське племянница (она в Москве), попросил её скачать и прислать мне мылом -- всё получилось.
Потом попробовал опять -- аналогичная картина. Пробую под виндой -- wget вообще выдаёт ошибку 500 и ничего не скачивает.
Сейчас решил ещё раз попробовать скачать файл Улица, улица... -- по-прежнему wget берёт только 1222 байта. Попросил племянника (он в другой части города) -- он скачал 43 кб, прислал их мне, я дал команду
wget -c http://mp3.music.lib.ru/mp3/a/aleksandr_tk...ica_ulica-2.mp3
всё докачалось без проблем.
Ради интереса решил продолжить с байта 5712 -- проблем не было. Но почему из этого куска скачивались только первые 1222 байта? Хотя никаких "особенных" комбинаций байтов в этом куске нет; вот его дамп:

Код:

$ od -t x1 aleksandr_tkach_petro-ulica_ulica-2.mp3 0000000 ff fb a0 6c 00 0f f0 00 00 00 00 00 00 00 00 00 0000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0001000 00 00 00 00 00 00 00 00 00 00 ff fb a0 6c f3 0f 0001020 f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0002020 00 00 00 00 ff fb a2 6c ff 8f f0 00 00 00 00 00 0002040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0003020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 0003040 fb a0 6c ff 8f f0 00 00 00 00 00 00 00 00 00 00 0003060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0004040 00 00 00 00 00 00 00 00 00 ff fb a2 6c ff 8f f0 0004060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0005060 00 00 00 00 ff fb a0 6c ff 8f f0 00 00 00 00 00 0005100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0006060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff fb 0006100 a2 6c ff 8f f0 00 00 00 00 00 00 00 00 00 00 00 0006120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0007100 00 00 00 00 00 00 00 00 00 ff fb a0 6c ff 8f f0 0007120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0010120 00 00 00 ff fb a2 6c ff 8f f0 00 00 00 00 00 00 0010140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0011120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff fb 0011140 a0 6c ff 8f f0 00 00 00 00 00 00 00 00 00 00 00 0011160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 0012140 00 00 00 00 00 00 00 00 ff fb a0 6c ff 8f f0 00 0012160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Кто-нибудь может что-нибудь посоветовать, как искать причину этого?

P.S. Может быть это и не связано с этим, но при скачивании образа диска (в частности Ubuntu 9.04) я в файле wget-log заметил довольно странные участки. Вот один из наиболее странных:

Код:

908500K .......... .......... .......... .......... .......... 20% 216K 5h3m 908550K .......... .......... .......... .......... .......... 20% 210K 5h3m 908600K .......... .......... .......... .......... .......... 20% 215K 5h3m 908650K .......... .......... .......... .......... .......... 20% 30,8K 5h3m 908700K .......... .......... .......... .......... .......... 20% 393K 5h3m 908750K .......... .......... .......... .......... .......... 20% 638K 5h3m 908800K .......... .......... .......... .......... .......... 20% 444K 5h3m 908850K .......... .......... .......... .......... .......... 20% 210K 5h3m 908900K .......... .......... .......... .......... .......... 20% 183K 5h3m 908950K .......... .......... .......... .......... .......... 20% 228K 5h3m 909000K .......... .......... .......... .......... .......... 20% 936K 5h3m 909050K .......... .......... .......... .......... .......... 20% 76,0M 5h3m 909100K .......... .......... .......... .......... .......... 20% 73,2M 5h3m 909150K .......... .......... .......... .......... .......... 20% 77,7M 5h3m 909200K .......... .......... .......... .......... .......... 20% 598K 5h3m 909250K .......... .......... .......... .......... .......... 20% 210K 5h3m 909300K .......... .......... .......... .......... .......... 20% 215K 5h3m 909350K .......... .......... .......... .......... .......... 20% 216K 5h3m 909400K .......... .......... .......... .......... .......... 20% 210K 5h3m

Т.е. обычно скорость скачивания -- немного больше 200 кб/с. Мне понятно, что по какой-то причине она на некоторое время может заметно упасть. Но как она может прыгнуть почти под 80 МЕГАбайт в секунду? Причём на такой скорость взять 150 кб.
Причём, вот результат последовательй выдачи команды 6 раз:

Код:

dk4:/Install/Linux/Ubuntu# wc wget-log ; grep 7.,.M wget-log | wc 28603 257396 2264045 wget-log 906 8154 71630 dk4:/Install/Linux/Ubuntu# wc wget-log ; grep 7.,.M wget-log | wc 28615 257504 2265009 wget-log 906 8154 71630 dk4:/Install/Linux/Ubuntu# wc wget-log ; grep 7.,.M wget-log | wc 28673 258023 2269618 wget-log 910 8190 71950 dk4:/Install/Linux/Ubuntu# wc wget-log ; grep 7.,.M wget-log | wc 28775 258942 2277781 wget-log 916 8244 72430 dk4:/Install/Linux/Ubuntu# wc wget-log ; grep 7.,.M wget-log | wc 28848 259600 2283640 wget-log 920 8280 72750

Т.е. строки, в котороых wget сообщает, что скачал очередные 50 кб со скоростью больше 70 Мб/с появляются не так уж и редко. Причём, группами.
Спасибо сказали:
Ответить