Ich habe eine Möglichkeit implementiert, gleichzeitige Jobs in Bash zu haben, wie gesehen here.Bash gleichzeitige Jobs bleibt stecken
Ich bin durch eine Datei mit etwa 13000 Zeilen durchlaufen. Ich bin nur testen und Drucken jeder Zeile, wie zum Beispiel:
#!/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!"
ich auch andere Lösungen versucht haben, wie this und this, aber mein Problem ist persistent:
Bei einem „random“ gegeben Schritt normalerweise zwischen der 2000. und der 5000. Iteration bleibt es einfach stecken. Ich habe diese verschiedenen echo
in der Mitte des Codes, um zu sehen, wo es stecken bleiben würde, aber es das letzte, was es druckt, ist die $url $i
.
Ich habe den einfachen Test gemacht, um jede Parallelität zu entfernen und den Dateiinhalt einfach zu loopen: alles ging gut und es lief bis zum Ende.
So denke ich, dass ich eine Einschränkung der Parallelität vermisse, und ich frage mich, ob mir jemand helfen könnte, es herauszufinden.
Vielen Dank!
http://mywiki.wooledge.org/ProcessManagement ist ein guter Anfang. –
Warum haben Sie zusätzliche doppelte Anführungszeichen um '$ 1' in' echo "link #" $ 2 "[" $ 1 "]" ' – Inian
BTW, gibt es eine Tonne von (nicht-zu-Ihrem-unmittelbaren-Problem) zitiert Bugs in dieser Code. Überlege, ob du deine Skripte über http://shellcheck.net/ ausführen möchtest, bevor du sie hier veröffentlichst. –