綾小路龍之介の素人思考

呼び出し2

これでもまだ面倒だ、と言う人のために。ダウンロード用のスクリプトを呼び出すスクリプトを作ってみた。

#!/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倍くらいのスピードになった。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2006-03-28T18:32:05+09:00
  2. Modified: 2006-03-28T10:25:39+09:00
  3. Generated: 2017-09-13T23:10:55+09:00