#!/bin/bash
trap 'echo "trapped."; exit 1' 1 2 3 15
declare -r listfile="hoge-list"
declare -r lockfile="${listfile}.lock"
function download
{
local -r url=$1
#local num=`expr ${RANDOM} % 100`
sh hoge.sh -u "${url}"
#sleep ${num}
}
function process
{
while [ `find ${listfile} -size +0` ];
do
if lockfile -1 ${lockfile}
then
url=`head -n1 ${listfile}`
sed -si 1d ${listfile}
fi
rm -f ${lockfile}
download ${url}
done
}
function main
{
local -i i=0
while [ ${i} -lt 2 ];
do
(
process
)&
i=`expr ${i} + 1`
done
wait
}
main
exit
こいつを適当な名前(hoge-list.sh)で保存。hoge.sh(ダウンロード用のスクリプト)とhoge-list(URLの書かれたリスト)と同じ場所に保存。
$ sh hoge-list.sh
2つのプロセスを平行に走らせて、同じリストファイルからURLを読んでいる。平行に走らせるプロセスの数は同時にダウンロードする数に対応している。ダウンロード用のスクリプト内における「分割数」と「プロセスの数」の積がホストに対して張るコネクションの数に対応しているので、増やしすぎると302 Foundでエラーページにリダイレクトされる。ダウンロード用のスクリプトの中でcURLに与えるリトライ数を増やしておけば対応可能だが、YourFileHost側からすれば迷惑な話だろう。分割数を減らすかプロセス数を減らすことをお勧めする。2プロセス走らせても2倍のスピードになるわけではない。実際、1.5倍くらいのスピードになった。