Pull to refresh
21
0
Сергей @driver_by

User

Send message
Спасибо, добавил в скрипт использование mktemp.
Плюсы:
— можно отказаться от переменной tmp_dir.
— создается случайное имя (вместо «XX» — буквы/цифры), что исключает возможности перезаписи одного временного файла при одновременном вхождении в функцию move_line() в разных потоках.
/bin/bash исправил на /bin/sh
А такой способ деления списка — тоже вариант. Просто я хотел чтобы список можно было пополнять и во время закачек. Это до конца не реализовано (если качается в несколько потоков, все кроме одного завершились, то при добавлении в список n ссылок они будут качаться одним потоком). Можно немного изменить скрипт чтобы потоки не завершались, а раз в n минут проверяли опять список. Тогда можно использовать его, например, на сервере: просто скидывать сслыки в файл (echo ... >> download.lst)и они сами будут скачиваться.
Поэтому и написал: «практически». Хотя, если откровенно, то не знал что wget не входит в FreeBSD, думал, что он входит во все популярные дистрибутивы. Теперь думаю что это относится, скорее, к потомкам System V.
Да, есть такая замечательная утилита — aria2c (поддерживает скачивание нескольких файлов одновремено, скачивание по списку, + еще скачивание сегментами одного файла). Правда о ее существовании я узнал только после начала работы над скриптом. Поэтому, чтобы оправдать проделанную мной работу, скажу: wget входит практически во все дистрибутивы *nix (можно сказать что это стандарт). Так что для тех у кого нет возможности/желания устанавливать дополнительные программы я написал этот скрипт =)
Внес изменения в скрипт по Вашему совету. Вместо:
while [ $i -le $threads ]
do
    download_thread $i &
    sleep 1
    i=`expr $i + 1`
done
if [ ! -e $error_list ]; then touch $error_list; fi
# По наличию записей в active.lst error.lst проверяем идет ли закачка
while [ -s $active_list ] || [ -s $error_list ]
do
    sleep 1
done

Вот этот код:
while [ $i -le $threads ]
do
    download_thread $i &
    downloader_pid="${downloader_pid} $!"
    sleep 1
    i=`expr $i + 1`
done
if [ ! -e $error_list ]; then touch $error_list; fi
# Ждем окончания всех закачек
wait $downloader_pid
Спасибо за подсказку, сейчас попробую ее использовать.

Information

Rating
Does not participate
Location
Гомель, Гомельская обл., Беларусь
Date of birth
Registered
Activity