hereのように、並列ジョブをbashで実行する方法を実装しました。Bashの並行ジョブがスタックする
私は約13000行のファイルをループしています。私はちょうどのような、それぞれのラインをテストし、印刷しています:
#!/bin/bash
max_bg_procs(){
if [[ $# -eq 0 ]] ; then
echo "Usage: max_bg_procs NUM_PROCS. Will wait until the number of background (&)"
echo " bash processes (as determined by 'jobs -pr') falls below NUM_PROCS"
return
fi
local max_number=$((0 + ${1:-0}))
while true; do
local current_number=$(jobs -pr | wc -l)
if [[ $current_number -lt $max_number ]]; then
echo "success in if"
break
fi
echo "has to wait"
sleep 4
done
}
download_data(){
echo "link #" $2 "["$1"]"
}
mapfile -t myArray < $1
i=1
for url in "${myArray[@]}"
do
max_bg_procs 6
download_data $url $i &
((i++))
done
echo "finito!"
私はまた、thisやthisなどの他の解決策を試してみたが、私の問題は、永続的である:
「ランダム」は、与えられたステップ通常は2000番目と5000番目の反復の間に、単に詰まってしまいます。私はコードの中にさまざまなものを入れて、どこに行き詰まっているのかを確認しましたが、最後に印刷するのは$url $i
です。
私は単純なテストを行って並列性を取り除き、ファイルの内容をループさせました。すべてうまく行き、最後までループしました。
だから、私は並列性にいくつかの制限がないと思うし、誰かがそれを理解するのを手伝ってくれるのだろうかと思う。
多くの感謝!
http://mywiki.wooledge.org/ProcessManagementは、開始するには良い場所です。 –
なぜ、 '' $ 2' ["$ 1"] "' – Inian
の 'echo 'リンクで' $ 1'の周りに余分な二重引用符があるのですか?このコード。ここに投稿する前に、http://shellcheck.net/でスクリプトを実行することを検討してください。 –