Skip to content

Schlag beim Einfädeln der Schlaufe

Lösung:

Sie können Aufgaben in den Hintergrund senden, indem Sie &
Wenn Sie warten möchten, bis alle fertig sind, können Sie die wait Befehl:

process_to_background &
echo Processing ...
wait
echo Done

Sie können die pid der im Hintergrund gestarteten Aufgabe, wenn Sie auf eine (oder wenige) bestimmte Aufgaben warten möchten.

important_process_to_background &
important_pid=$!
while i in {1..10}; do
    less_important_process_to_background $i &
done

wait $important_pid
echo Important task finished

wait
echo All tasks finished

Beachten Sie jedoch: Die Hintergrundprozesse können die Ausgabe durcheinander bringen, da sie asynchron ausgeführt werden. Möglicherweise möchten Sie eine Named Pipe verwenden, um die Ausgabe von ihnen zu sammeln.

bearbeiten

Wie in den Kommentaren gefragt, besteht möglicherweise die Notwendigkeit, die gegabelten Hintergrundprozesse einzuschränken. In diesem Fall können Sie verfolgen, wie viele Hintergrundprozesse Sie gestartet haben, und mit ihnen über eine Named Pipe kommunizieren.

mkfifo tmp # creating named pipe

counter=0
while read ip
do
  if [ $counter -lt 10 ]; then # we are under the limit
    { check $ip; echo 'done' > tmp; } &
    let $[counter++];
  else
    read x < tmp # waiting for a process to finish
    { check $ip; echo 'done' > tmp; } &
  fi
done
cat /tmp > /dev/null # let all the background processes end

rm tmp # remove fifo

Sie können mehrere Prozesse starten, die jeweils die Funktion aufrufen check und warte, bis sie fertig sind.

while read line 
do 
  ip=$line
  check &
done < $hosts
wait # wait for all child processes to finish

Ob dies die Geschwindigkeit abhängig von verfügbaren Prozessoren und der Funktion check's Umsetzung. Sie müssen sicherstellen, dass keine Datenabhängigkeit besteht check zwischen Iterationen.

Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.