私はこのスクリプトをbashで実行して理解し、後でPython(私ははるかにあまり知らない)で書くことができるようにしたいと思います。
私のデータにはいくつかのファイルがあります。 3. そうだ。
https://www.example.com/data/file27-1.jpg
https://www.example.com/data/file51-2.jpg
https://www.example.com/data/file2576-3.jpg
URL='https://www.example.com/data/file'
i=1 ; j=1
for i in {1..3000} ; do
curl -I ${URL}file${i}-{j}.jpg
# here, pipe result into grep,
### if !200 ((i++)) (so do nothing) ;
### if 200 wget $URL$i$j and ((j++)), and i=i-1 so I can have the same $i at the next loop, for a incremented $j
" and go on into the the for loop
done
しかし、curl
3000のリンクを取得するだけでも時間がかかります。どういうわけか並列化したいのですcurl -I URL
が、200応答を受け取ると、同じ$ j値を持つ2つのファイルがないので、すべてのプロセス要求を停止して$ jに1を追加してから、すべてを適切な値に復元します。 $iと$jを押し続けてください。
私は並列化(ただし、多くのスレッドを見つけること)に閉じ込められていますが、実際に私を邪魔しているのは、200がすべてのカールプロセスを終了し、$ iと$ jの値に対して200 OKに戻ることです。
わかりますように。まだサンプルスクリプトを書いていないので、それを実装する方法を研究しています。
ありがとう
編集する
#ps -ax | grep "curl" | grep -v "grep" | awk '{print $1}'| xargs kill -9
私はこのコマンドを使用して条件付きで使用可能なすべてのカール要求を終了し、if 200
$ iの値をi = i-1にリセットし、$ jを増やしてループを続行できることを知りました。
しかし、この段階では何も並列化されません。 xargsを使用してカールリクエストを並列化する方法を見つけることができますが、そのようにしてその価値を高めることはできません。
URLが生成される一時ファイルを考えましたが、スクリプトが実行されたときに生成したいと思います。
ベストアンサー1
以下は、目的のタスクを実行するのに役立つ小さな部分です。ロジックが正しいことを願っています。
#!/bin/bash
i=0
j=0
pid=0
ppid=0
#Enable job control; It's not used here but it can be usefull if you need to do more job control
set -m
for i in {1..3000} ; do
#Execute each curl in the background to have a sort of multi-threading and get get the HEAD response status and put it in file descriptor 3 to be gathered later
exec 3< <(curl -I ${URL}file${i}-{j}.jpg | head -n 1 | cut -d$' ' -f2)
#Get the pid of the background job
pid="$!"
#Get the parent pid of the background job
ppid="$(ps -o ppid= -p $pid)"
#Gather the HTTP Response code
status="$(cat <&3)"
#Check
if [ "$status" -eq 200 ] ; then
i="$(($i - 1))"
j="$(($j + 1))"
echo "kill all previous background process by their parent"
pkill -P $ppid
else
i="$(($i + 1))"
fi
echo " status : $status"
echo " parent : $ppid"
echo " child : $pid"
done