PDA

Bekijk de volledige versie : Еще один скрипт для фонового управления однопоточной загрузкой через wget



al37919
19-04-2007, 21:10
Хотя в принципе в конфе вопрос уже не раз обсуждался и предлагались разные скрипты для этой цели ( например, здесь: http://www.mtdev.com/2002/05/linux-wget/ ), тем не менее поделюсь скриптом собственной разработки, который осуществляет управлять закачкой с помощью wget в 1 поток. Скрипт написан на tcl. Для его работы требуется установить tcl, а также внешний wget:

ipkg install tcl
ipkg install wget

Добавление закачки производится путем добавления URL в текстовый файл ( /opt/tmp/wget/wget.list ), содержащий список закачек.

А вот собственно код
/opt/local/bin/check.wget.tcl :

#!/bin/sh
# The next line is executed by /bin/sh, but not tcl \
exec tclsh8.4 "$0" ${1+"$@"}

#This script was created by me (al37919) in an effort that it will be useful for myself.
#Use it on your ouwn risk. No warranty of any kind. No license of any kind. :)
#Version 2.0 { added support of pid file }
#Version 2.2 { bufixes }

#REFRESH_TIME is measured in seconds
set REFRESH_TIME 30

set WGET_BIN [file join / opt bin wget]
set WGET_BASE [file join / opt tmp wget]

set WGET_LIST [file join $WGET_BASE wget.list]
set WGET_LIST_COMPLETED [file join $WGET_BASE wget.completed.list]
set WGET_LIST_NOT_FOUND [file join $WGET_BASE wget.not_found.list]
set WGET_LOG [file join $WGET_BASE wget.log]

set WGET_PARTIAL [file join $WGET_BASE partial]
set WGET_COMPLETED [file join $WGET_BASE completed]

catch { exec sed -n 3p $argv0 | awk { { print $2 } } } TCLSH_BIN

#Returns list of lines read from the FileName
#Empty lines are skipped. Whitespaces are trimmed from both sides
proc FileToList {FileName} {
if {[catch {open $FileName r} f]} {
puts "Unable to open \"$FileName\" for reading; error $f."
exit
}
set lList {}
set str ""
while {![eof $f] } {
gets $f str
if {[string trim $str] ne ""} {
lappend lList [string trim $str]
}
}
close $f
return $lList
}

#Writes lList of lines into the FileName
#Whitespaces are trimmed from both sides
proc ListToFile {FileName lList} {
if {[catch {open $FileName w} f]} {
puts "Unable to open \"$FileName\" for writing; error $f."
exit
}
foreach i $lList {
puts $f [string trim $i]
}
close $f
}

#Checks that ::PIDFILE entries are really running in the memory
#In the ::PIDFILE there are 2 lines:
#Line 1 is the pid of this daemon itself (started through ::TCLSH_BIN)
#Line 2 is the pid of wget instance started from the daemon
proc CheckRunning { LineNum Name } {
set Running 0
if { [file exists $::PIDFILE] } {
catch { exec sed -n $LineNum\p $::PIDFILE } p1
catch { exec pidof $Name } p2
set lP2 [split $p2]
foreach i $lP2 {
if {$p1 == $i} {
incr Running
break
}
}
}
return $Running
}

if { $argc != 2 || [lindex $argv 0] ne "-p" } {
puts "USAGE:"
puts "$argv0 -p pidfile"
exit
}

set PIDFILE [lindex $argv 1]

if {[CheckRunning 1 $::TCLSH_BIN] > 0} {
puts "$::TCLSH_BIN $argv0 is already running"
exit
}

set lList [FileToList $::WGET_LIST]
set CurrentURL [lindex $lList 0]

#This is just precaution. If these dirs exist nothing will happen.
file mkdir $WGET_PARTIAL $WGET_COMPLETED

#The following is useful if the $WGET_LIST is empty while starting of $argv0
catch {open $PIDFILE w} f
puts $f [pid]
close $f

while {1} {
# set CurrentConnections [regexp -all {bin/wget} [exec ps]]
if {[CheckRunning 2 wget] == 0} {
set FileName [lindex [file split $CurrentURL] end]
set lList [FileToList $::WGET_LIST]
set Out [exec head -n3 $::WGET_LOG]
set rule "^.*$FileName.*"
#Do nothing if the line is empty (this includes also empty input file)
if { "X$CurrentURL" ne "X"} {
#Let's check that log corresponds to the top line of wget.list
if {[regexp $rule $Out]} {
set Out [exec tail -n3 $::WGET_LOG]
set rule "^.*$FileName.*saved.*"
#Check if the file is completed
if {[regexp $rule $Out] || [regexp {The file is already fully retrieved; nothing to do} $Out]} {
file rename -force [file join $::WGET_PARTIAL $FileName] [file join $::WGET_COMPLETED]
for {set i 0} {$i < [llength $lList]} {incr i} {
if {[lindex $lList $i] eq $CurrentURL} {
set lList [lreplace $lList $i $i]
incr i -1
}
}
ListToFile $::WGET_LIST $lList
set f [open $::WGET_LIST_COMPLETED a]
puts $f $CurrentURL
close $f
set CurrentURL ""
}
#Check if URL is not found
set rule "^.*ERROR 404.*Not Found.*|^.*Resolving.*failed: Name or service not known.*|^.*not an http or ftp url.*"
if {[regexp $rule $Out]} {
for {set i 0} {$i < [llength $lList]} {incr i} {
if {[lindex $lList $i] eq $CurrentURL} {
set lList [lreplace $lList $i $i]
incr i -1
}
}
ListToFile $::WGET_LIST $lList
set f [open $::WGET_LIST_NOT_FOUND a]
puts $f $CurrentURL
close $f
set CurrentURL ""
}
}
}
if {[llength $lList] != 0} {
set CurrentURL [lindex $lList 0]
# puts "starting new instance of wget"
# set WgetPid [exec $::WGET_BIN $CurrentURL --continue --directory-prefix=$::WGET_PARTIAL --output-file=$::WGET_LOG &]
set WgetPid [exec $::WGET_BIN $CurrentURL -c -P $::WGET_PARTIAL -o $::WGET_LOG &]
catch {open $PIDFILE w} f
puts $f [pid]
puts $f $WgetPid
close $f
}
}
after [expr {$::REFRESH_TIME * 1000}]
}
Этот скрипт сидит в оперативке и каждые 30 сек проверяет запущен ли wget. Если нет, то он запускает загрузку файла, который записан в первой строке файла /opt/tmp/wget/wget.list Первая версия использовала cron, однако, после достаточно длительного использования было обнаружено, что некоторые процессы не завершаются и остаются сидеть в памяти. Почему --- не знаю. Меня это несколько достало и я переделал этот скрипт и превратил его в демона.

второй скрипт под названием /opt/etc/init.d/S99wget запускает check.wget.tcl при перезагрузках, а также служит для запуска/остановки его вручную.

#!/bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin:/opt/local/bin

NAME=check.wget.tcl
DAEMON="/opt/local/bin/$NAME"
PIDFILE="/var/run/$NAME.pid"

start() {
echo -n "Starting $NAME... "
if [ ! -e $PIDFILE ] || [ -z $(ps | awk '{print $1}' | grep `sed -n 1p $PIDFILE`) ]
then
$DAEMON -p $PIDFILE &
echo "done."
else
echo "already running."
fi
}

stop() {
echo -n "Shutting down $NAME... "
if [ -e $PIDFILE ]
then
kill "`sed -n 2p $PIDFILE`" 2> /dev/null
kill "`sed -n 1p $PIDFILE`" 2> /dev/null
rm $PIDFILE
echo "done."
else
echo "not started."
fi
}

reload() {
echo -n "Reloading $NAME... "
if [ -e $PIDFILE ]
then
kill "`sed -n 2p $PIDFILE`" 2> /dev/null
echo "done."
else
echo "not started."
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
reload)
reload
;;
*)
echo "Usage: $0 (start|stop|reload|restart)"
exit 1
;;
esac
exit 0

Продолжение см. в следующем посте --- этот стал слишком длинным и его форум не переваривает

al37919
19-04-2007, 21:11
Для работоспособности всего этого создаем вручную директории, делаем оба вышеуказанных файла исполняемыми, а также создаем пару файлов:

mkdir -p /opt/tmp/wget/completed
mkdir -p /opt/tmp/wget/partial
chmod 755 /opt/local/bin/check.wget.tcl
chmod 755 /opt/etc/init.d/S99wget
touch /opt/tmp/wget/wget.list
touch /opt/tmp/wget/wget.log
Первый файл запускать не требуется. Все управление сосредоточено в S99wget.
Синтаксис /opt/etc/init.d/S99wget command . Поддерживаются следующие значения параметра command:
start --- запуск демона
stop --- остановка демона и загрузки
reload --- повторно считать wget.list и запустить первую строку на закачку без остановки демона
restart --- перезапуск демона и загрузки

В течение пары последних дней оба скрипта были переработаны и теперь используют pid-файл. Таким образом, можно быть уверенным, что stop, reload, restart оказывают действие только на те процессы wget и tclsh8.4, которые были запущены демоном. Именно поэтому, для управления должен использоваться только скрипт S99wget

Используемые файлы:
/opt/tmp/wget/wget.list : список URL-ов предназначеных к закачке. Единственный файл, который имеет смысл трогать вручную --- добавлять сюда новые URL-ы. Если надо изменить последовательность закачиваний --- меняйте местами строки в этом файле. Закачка идет построчно сверху вниз. При замене первой строчки загрузка предыдущего файла будет продолжаться до конца, потом пойдет новый первый. Если надо запустить загрузку нового первого файла не дожидаясь окончания предыдущего, надо выполнить S99wget reload При этом неоконченый предыдущий сохранится и когда до него дойдет очередь будет загружаться с того места на котором остановился.
/opt/tmp/wget/wget.log : процесс закачки текущего файла.
/opt/tmp/wget/wget.completed.list : список закачаных URL-ов
/opt/tmp/wget/wget.not_found.list : список ненайденных URL-ов
/opt/tmp/wget/completed : директория, содержащая закачаные файлы
/opt/tmp/wget/partial : директория, содержащая частично-закачаные файлы

Наблюдается и некоторая странность --- ps показывает, что в памяти сидят 3 процесса check.wget.tcl Памяти они лишней вроде не занимают. Будем считать, что это не баг, а фича. Хотя если кто значет почему так и можно ли сделать иначе, будет любопытно узнать.
P.S. Оказалось, что это действительно фича. При переходе на tcl-8.4.14 (откомпиленный нативно, хотя скорее всего дело не в этом) три процеса в памяти исчезают, оставтеся один.

Если Вам больше по душе curl, то переделать этот скрипт под него не составит труда, по сути надо изменить только имя сервиса, путь и одну коммандную строку вызова.

У меня все это живет уже месяца два с лишним и лично меня вполне удовлетворяет.

Тут поступило следующее пожелание --- ограничение времени работы загрузчика определенным временным интервалом. Т.е., скажем с 22.00 до 8.00 работать, остальное время не работать. Для этого предлагаю сделать следующее

1) Установить cron и отконфигурить его, согласно инструкции в этой конференции.
2) дописать 2 строки в /opt/etc/crontab

cat >> /opt/etc/crontab << EOF
0 22 * * * root /opt/etc/cron.d/start_wget
0 8 * * * root /opt/etc/cron.d/stop_wget
EOF

3) создать файлы start_wget и stop_wget и сделать оба файла исполняемыми

cat > /opt/etc/cron.d/start_wget << EOF
#! /bin/sh
/opt/etc/init.d/S99wget start
EOF

cat > /opt/etc/cron.d/stop_wget << EOF
#! /bin/sh
/opt/etc/init.d/S99wget stop
EOF

chmod 600 /opt/etc/crontab
chmod 700 /opt/etc/cron.d/start_wget
chmod 700 /opt/etc/cron.d/stop_wget

По-моему, все.

vovan007
20-04-2007, 05:49
1. Как установить внешний wget? ipkg install wget пишет, что такого пакета нет (да и в файле http://ipkg.nslu2-linux.org/feeds/unslung/wl500g/Packages он отсутствует).
2. Команда /opt/etc/init.d/S99wget start приводит к ошибке:
/bin/sh: Can't open
Это из-за неустановленого wget?
3. А встроеный в прошивку wget не подойдет?

al37919
20-04-2007, 07:19
1) правильный репозиторий пакетов не unslung/wl500g , а optware/oleg . Там их существенно больше. К сожалению, при переключении на него надо переустанавливать все пакеты. Правильная строка в /opt/etc/ipkg.conf
src optware http://ipkg.nslu2-linux.org/feeds/op...g/cross/stable

В общем, см: http://wl500g.info/showthread.php?t=8970

2) Символы конца строки во всех исполняемых скриптах должны быть не CR+LF как в винде, а только LF (стандарт unix).

Как этого добиться.
а) Если установлен внешний busybox (проверял только на optware, хотя в unslung вроде та же версия), то в нем есть утилита dos2unix, которая может конвертить в правильный формат.
б) Если установлено nano, то при сохранении ( ctrl-X Y ) (т.е. в тот момент, когда запрашивается имя файла для сохранения), по крайней мере у меня показывается внизу, что это файл типа DOS и можно этот режим выключить (Esc D).
в) Кстати, только что посмотрел --- есть даже 2 плугина к far, которые обещают делать эту самую конверсию. Пока не пробовал как это работает.
г) Вот, предложили еще один вариант, пожалуй наиболее универсальный:
cat filename | tr -d "\r" > filename.new; mv -f filename.new filename

3) Встроенный не пойдет, т.к. он не поддерживает опцию -o (запись лога закачки). Решение об окончании закачки (а также об ошибке закачки) и переходу к следующей принимается на основании анализа лога.

alex_b
27-05-2007, 18:39
почему-то после первой же скачки демон вываливается с ошибкой, приходится постоянно перезапускать



error renaming "/opt/tmp/wget/partial/fat.rar": no such file or directory
while executing
"file rename -force [file join $::WGET_PARTIAL $FileName] [file join $::WGET_COMPLETED]"
("while" body line 16)
invoked from within
"while {1} {
# set CurrentConnections [regexp -all {bin/wget} [exec ps]]
if {[CheckRunning 2 wget] == 0} {
set FileName [lindex [file spli..."
(file "/opt/local/bin/check.wget.tcl" line 91)


что это может быть?

Megarem
30-05-2007, 18:50
почему-то после первой же скачки демон вываливается с ошибкой, приходится постоянно перезапускать
Ага. Я не разбираюсь в tcl, но глюк пофиксил. Нужно добавить одну строчку в скрипт.


puts $f $CurrentURL
close $f
set CurrentURL ""

Правда есть еще какие-то косяки со стартом/стопом. Буду разбираться.

Megarem
31-05-2007, 06:51
И еще одно маленькое усовершенствование. Если добавить перед while{1} строки

catch {open $PIDFILE w} f
puts $f [pid]
close $f

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

alex_b
03-06-2007, 00:41
Было бы здорово еще файл со списком URL-ов и логи размещать не на винте - зачем его раскручивать каждые 30 сек? где бы их безопаснее разместить...

Megarem
03-06-2007, 10:13
Было бы здорово еще файл со списком URL-ов и логи размещать не на винте - зачем его раскручивать каждые 30 сек? где бы их безопаснее разместить...
Можно в /tmp. В начале первого файла поменяй WGET_LIST на что-нибудь вроде set WGET_LIST [file join / tmp wget.list] Но помни, что при рестарте рутера этот файл будет потерян.

P.S. Новая версия стартового скрипта. Изменения косметические, но все-таки...

alex_b
03-06-2007, 23:45
Ага. Я не разбираюсь в tcl, но глюк пофиксил. Нужно добавить одну строчку в скрипт.


Правда я не понял куда добавить...

Megarem
04-06-2007, 18:01
В аттачменте находится последняя версия скрипта, модифицированная мной. Скопировать wget.tcl в /opt/bin, S20wget в /etc/init.d. Поправить при необходимости в первом файле пути к директории и файлам, где лежат закачки (у меня они отличаются от тех, что были в скрипте от al37919). Также я сделал небольшое усовершенствование для тех, что часто льет файлы с одних и тех же серверов, требующих авторизации. Поищите в скрипте строчку secret.com. Надеюсь понятно, что надо сделать? :)

al37919
15-06-2007, 09:20
Приятно видеть, что кому-то этот мой опус оказался полезным. Спасибо за замечания и багфиксы.
В коде первого поста добавил:
1.
catch {open $PIDFILE w} f
puts $f [pid]
close $f
2.
set CurrentURL ""
3. автосоздание директорий partial и completed
4. Обновил скрипт для запуска.

Насчет раскрутки винта каждые 30 сек --- лично я считаю, что для винта здоровее не останавливаться совсем :)

Здесь ( http://wl500g.info/showthread.php?t=9426 ) имеется набор cgi скриптов от венгерского коллеги для наблюдения за процессом закачки, добавления закачки, запуска/остановки демона через браузер. Может окажется кому-нибудь полезным.

alex_b
15-06-2007, 09:57
Спасибо за замечания и багфиксы.
вам спасибо!

Насчет раскрутки винта каждые 30 сек --- лично я считаю, что для винта здоровее не останавливаться совсем :)
для винта может быть и здоровее, только громко работает, ночью не заснуть =)

igaryan
23-06-2007, 18:36
Здраствуйте. Мне тоже скрипт понравился, только с русскими буквами в ссылках работа не получается. То есть закачивается только первый файл. Я так понимаю что при переносе программа его не находит. Что можно сделать? Заранее спасибо.

al37919
23-06-2007, 20:01
скорее всего дело в несоответствии кодировок.
unix (а следовательно и роутер) в файловой системе сейчас использует UTF-8 (unicode), а винда по-прежнему 1251.

Что бы решить проблему надо протестить следующее:

1) через telnet/ssh разобраться в какой кодировке wget корректно грузит URL-ы (к сожалению, я в этой теории не подкован --- если никто не посоветует как правильно, значит надо экспериментировать).

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

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

Могу подкинуть две идеи (для решения второго вопроса, да и для тестирования первого могут оказаться полезными):

Здесь http://wl500g.info/showthread.php?t=2376 Олег пишет как настроить самбу, чтобы она корректно отображала русские имена файлов, сохраненные на роутере в кодировке UTF-8 (причем только отображать, при копировании перекодировка не производится, хотя именно это может оказаться и полезным).

Здесь http://wl500g.info/showpost.php?p=53426&postcount=7 приводится рецепт модификации vsftpd (в т.ч. готовый бинарник), чтобы он делал на лету перекодировку 1251-UTF8. Таким макаром можно корректно как просматривать содержимое роутера, так и копировать кириллифицированные файлы с винды на роутер и обратно.

Для работы с файловой системой роутера очень удобно использовать FAR, т.к. в нем очень легко изменять кодовую страницу русского текста, а также можно иметь удаленный доступ по протоколам SMB, FTP, SSH (последнее с доп. плагином, например WinSCP).

igaryan
24-06-2007, 08:08
Еще одна проблема выявилась при загрузки русских файлов.
Набираю /opt/etc/init.d/S99wget stop
Пишет Shutting down check.wget.tcl... done.
Но загрузка продолжается.
Набираю заново
Пишет Shutting down check.wget.tcl... not startted.
Вот.

Megarem
24-06-2007, 14:50
Здраствуйте. Мне тоже скрипт понравился, только с русскими буквами в ссылках работа не получается.
Дай пример ссылки, которая вызывает ошибку. Я тут делаю свою версию этого скрипта (с веб-мордой и поддержкой axel для многопоточной закачки) - посмотрю, что можно сделать.

igaryan
27-06-2007, 14:31
Я уж успел и свежую асусовскую прошивку поставить - тоже глючит, русские закачки сами собой пропадают.

Megarem
27-06-2007, 19:48
Ссылка недоступна. Попробую сам поэксперементировать, но ничего не гарантирую. Русские буквы в ссылках - это зло.

igaryan
04-07-2007, 18:20
Что-то у меня все-таки глючит этот скрипт и с английскими файлами. Вариант от Megarem вообще закачивает только первый файл. Оригинал от al37919 работает, но криво: первые два файла по несколько килобайт закачалось нормально, потом пошел многотомный архив, файлы по 95 Мб, первый файл - закачалось 165 Мб, второй 116 Мб, в папке partial почему-то 2 файла. Вообщем глюки. А есть на форуме еще подобные скрипты?

al37919
04-07-2007, 19:25
полагаю, что дело в конкретных ссылках. За загрузку отвечает wget --- один из наиболее зрелых и популярных загрузчиков. Возможно, он не со всеми новомодными веб-мастерскими извратами умеет справляться, тем более, что эта братва любит бороться с неинтерактивными способами закачки --- нет заработка на показе рекламы.

в partial может быть легко хоть десять файлов:
1) если url добавлен в начало списка и wget прибит. Это задумывалось специально, как возможность приоретизации закачек (можно даже сделать автоперезапуск при изменении первой строки в списке). При этом закачанная часть предыдущей закачки не пропадает, а ждет пока до нее дойдет очередь и докачивается.
2) если имя файла изменилось в процессе закачки --- url то у Вас не прямой.

В общем, ИМХО, ищите глюки в Ваших УРЛах.

P.S. Если wget не по душе, на роутере еще доступен curl

igaryan
04-07-2007, 20:00
Пока сделал проще - вручную запустил wget на закачку каталога. В принципе достаточно команд wgetа, чтоб управлять закачками. Как-то сразу я не понял этого :-)

al37919
04-07-2007, 21:49
вот это уже дело :)
wget, кстати, и список url-ов из файла читать может. Только добавлять их туда нельзя без перезапуска

Sanyo
04-07-2007, 23:32
Привет Всем.
Народ, кто подскажет такую вещь.
Установил указанные скрипты, запустил - все работает. Но есть одно очень важное НО...

Обратил внимание, что очень медленно качает... (относительно ширины канала) а так же что команда "vi" сжирает все процессорное время.
Как я понимаю в это м и проблема медленной закачки. Можно ли как-нибудь сделать не столь интенсивный анализ лога?

al37919
05-07-2007, 05:33
команда "vi" сжирает все процессорное время
А что такое, пардон, комманда "vi" ?

Анализ лога тут ни при чем. Из лога раз в 30 секунд проверяются только три последних строчки, чтобы узнать закончилась ли очередная закачка и решить почему.

Можно запустить для проверки загрузку с помощью wget напрямую.

Megarem
05-07-2007, 07:13
Обратил внимание, что очень медленно качает... (относительно ширины канала)
Это проблема не скрипта. Причины могут быть разные, например нестабильное соединение или медленный сервер, с которого идет закачка. Возможное решение этой проблемы - скачка файла в несколько потоков (ну или одновременная закачка нескольких файлов). У меня была точно такая же проблема. Скорость прыгала в диапазоне 9-12 кил при скачке. После перехода на axel и 3 потока канал стал забиваться полностью и прыжки скорости исчезли.
Вообщем подожди немного, я планирую выложить свою полностью переписанную версию скрипта, которая будет работать и с вгетом и с акселем. Сам скрипт в принципе уже отлажен, надо только немного дописать веб-морду к нему.

alex_b
05-07-2007, 08:06
я планирую выложить свою полностью переписанную версию скрипта, которая будет работать и с вгетом и с акселем. Сам скрипт в принципе уже отлажен, надо только немного дописать веб-морду к нему.
ждем с нетерпением =)

Sanyo
05-07-2007, 14:48
Я согодня проведу тесты.
Но на состояние на вчерашний вечер ситуация была такова:
Если анализируемый лог-файл находится на юсб-венике, скорость около 150кБАЙТ в сек.
а если на родной флешке (/tmp/wget.log) - что обеспечивает более быстрое чтение а соответсвенно и анализ лога, то 250 - 300КБАЙТ в сек.

И все процесорное время в обоих случаях пожирает "vi".
Канал большой, можно качать почти 3Мбайта в сек. при чем проверено несколько раз между роутером и сервером. Канал тут не причем, с сервер тоже - это 100%.

al37919
05-07-2007, 19:37
Еще раз повторю, что проблема не может быть в анализе лога, т.к. анализ заключается в том, что раз в 30 сек проверяются последние три строки лог-файла.
Однако, возможно проблема в записи лога wget-ом. Он пишет один символ на каждый килобайт информации, причем скорее всего не пакетом, а по отдельным байтам. Т.е. число обращений к файлу лога в процессе записи может быть значительным. Хотя все равно странновато, что он может так тормозить.
/tmp/wget.log находится не на встроенной флешке, а в оперативной памяти, т.е. запись туда производится действительно быстрее.

vi --- это текстовой редактор. Он не используется данным скриптом и пожирать ничего не может. Чем меряли это "пожирание процессорного времени"?

sergicus
09-08-2007, 13:50
ну и как с новой версией скрипта ???

vit5041
13-06-2008, 10:15
Господа, приветствую!

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

Хочу обратиться за помощью, т.к. из имеющихся в данной ветке двух скриптов, оба у меня глючат, причем по-разному:

1) оригинальный скрипт от al37919, приведенный в первом посте - у меня некорректно определяет, что один поток скачки уже запущен. Поэтому, если поставлен на скачку большой файл, скрипт запускает каждые 30 с. дополнительные процессы wget, если это только руками не прекратить. При этом портится содержимое лога, и происходят непонятные вещи (файл может также испортиться, увеличиться по сравнению с оригинальным своим размером).
Если же качаю лист мелких файлов - все проходит нормально - файл скачивается, url заносится в список completed.list, файл также переносится в папку completed - начинается скачиваение следующего и т.п.

2) скрипт, доработанный Megarem - корректно определяет наличие одного процесса wget в памяти, однако после того, как файл скачан - больше ничего не происходит, файл остается в папке partial, процесс wget повторно пытается запускаться, и в лог в результате записывается

The file is already fully retrieved; nothing to do.

http://: Invalid host name.
http://: Invalid host name.

соответственно скачивание остальных файлов не начинается, даже если остановить все руками и снова запустить.

Хелп!!!

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

пока пытаюсь разбираться сам, однако с tcl пока не получается, какой-то мудреный синтаксис.. буду благодарен за помощь!

vit5041
13-06-2008, 11:33
Замена функции оригинальной функции из первого скрипта на эту (из второго) (см. ниже) дала положительный результат. вроде все работает пока. :confused:
попозже постараюсь разобраться, в чем же было дело.
Тем не менее, буду рад увидеть какие-либо наработки в этом направлении.

proc CheckRunning { LineNum Name } {
catch { exec sed -n $LineNum $::PIDFILE } p1
catch { exec pidof $Name } p2
set lP2 [split $p2]
set Running 0
foreach i $lP2 {
if {$p1 == $i && $i != ""} {
incr Running
break
}
}
return $Running
}

Megarem
13-06-2008, 15:10
Я написал с нуля свой скрипт:
http://wl500g.info/showthread.php?t=9947
Попробуй его.