504 Stimmen

Wie führt man mehrere Programme parallel in einem Bash-Skript aus?

Ich versuche, eine .sh-Datei der viele Programme ausführt gleichzeitig

Ich habe dies versucht

prog1 
prog2

Aber das führt prog1 aus, wartet dann, bis prog1 endet und startet dann prog2...

Wie kann ich sie also parallel betreiben?

497voto

Ory Band Punkte 12928

Wie wäre es damit:

prog1 & prog2 && fg

Dies wird:

  1. Start prog1 .
  2. Schicken Sie es in den Hintergrund, aber drucken Sie seine Ausgabe weiter.
  3. Start prog2 y im Vordergrund halten so können Sie es mit ctrl-c .
  4. Wenn Sie schließen prog2 kehren Sie zurück zu prog1 's im Vordergrund so können Sie es auch mit ctrl-c .

482voto

psmears Punkte 23659

Um mehrere Programme parallel laufen zu lassen:

prog1 &
prog2 &

Wenn Ihr Skript warten soll, bis die Programme beendet sind, können Sie dies hinzufügen:

wait

an dem Punkt, an dem das Skript auf sie warten soll.

275voto

Quinn Comendant Punkte 7899

Wenn Sie in der Lage sein wollen, mehrere Prozesse einfach auszuführen und zu beenden mit ctrl-c Dies ist meine Lieblingsmethode: mehrere Hintergrundprozesse in einem (…) Unterschale, und Falle SIGINT zur Ausführung kill 0 was alles, was in der Subshell-Gruppe gespawnt wurde, tötet:

(trap 'kill 0' SIGINT; prog1 & prog2 & prog3)

Sie können komplexe Prozessausführungsstrukturen haben, und alles wird mit einer einzigen ctrl-c (vergewissern Sie sich nur, dass der letzte Prozess im Vordergrund läuft, d. h. schließen Sie keine & nach prog1.3 ):

(trap 'kill 0' SIGINT; prog1.1 && prog1.2 & (prog2.1 | prog2.2 || prog2.3) & prog1.3)

140voto

trusktr Punkte 39258

Sie können verwenden wait :

some_command &
P1=$!
other_command &
P2=$!
wait $P1 $P2

Es ordnet die PIDs des Hintergrundprogramms Variablen zu ( $! die PID des zuletzt gestarteten Prozesses ist), dann wird die wait Der Befehl wartet auf sie. Das ist gut, denn wenn Sie das Skript beenden, werden auch die Prozesse beendet!

103voto

Ole Tange Punkte 29091

Mit GNU Parallel http://www.gnu.org/software/parallel/ Es ist so einfach wie:

(echo prog1; echo prog2) | parallel

Oder wenn Sie es vorziehen:

parallel ::: prog1 prog2

Erfahren Sie mehr:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X