Bash:パラレルカールと変数

Bash:パラレルカールと変数

私はこのスクリプトを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

しかし、curl3000のリンクを取得するだけでも時間がかかります。どういうわけか並列化したいのです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

おすすめ記事