Führen Sie eine Reihe von Befehlen unabhängig voneinander aus

Führen Sie eine Reihe von Befehlen unabhängig voneinander aus

Wenn ich eine Datei mit

cmd1

cmd2

cmd3

Und ich möchte sie unabhängig voneinander ausführen, und unabhängig davon, ob ein Beendigungsstatus ausgegeben wird oder nicht (das heißt, nicht mit einer Beendigung rechnen, sondern einfach weiter Prozesse starten, die fehlschlagen können oder nicht). Ich weiß, dass dadurch ;der nächste Befehl ausgeführt würde, aber das ist nicht der Fall, weil gewartet wird, bis der vorherige Befehl entweder fehlschlägt oder erfolgreich ist. Ich möchte alle Befehle gleichzeitig starten.

Es ist etwa so sleep 60m: und dann Musik abspielen, eine Glocke ertönen lassen, den Browser starten. Es gibt aber offensichtlich keine Möglichkeit, zu warten, bis die Musik abgespielt wird, damit eine Glocke ertönen kann, und dann erst danach den Browser zu starten. Es muss sofort passieren.

HINZUFÜGT: wie man zum Beispiel

Zeilen aus Datei lesen, für jede Zeile ein Terminal öffnen und ausführen?

Antwort1

Durch einfaches Hinzufügen eines Et-Zeichens am Ende jeder Zeile werden alle Befehle in den Hintergrund verschoben.

cmd1 &
cmd2 &
cmd3 &

Beispiel

$ more at_once.bash 
#!/bin/bash

echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep

Wenn wir jetzt dieses Skript ausführen:

$ ./at_once.bash 
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10

Sie können sogar sehen, dass die Aufgaben aufgrund ihrer Hintergrundnatur in der falschen Reihenfolge ausgeführt wurden, wobei der dritte Befehl vor dem zweiten wiederholt wurde. Das pgrep sleepzeigt, dass alle drei Hintergrundbefehle gleichzeitig ausgeführt werden.

NOTIZ:Ich habe die Notation echo "X" && sleep 10einfach verwendet, um anzuzeigen, dass die Befehle im Hintergrund ausgeführt wurden. Diese Notation hat nichts mit der Hintergrundausführung selbst zu tun. Das Nachstellen &„versetzt“ die sleep 10Befehle in den Hintergrund.

Sie können es auch als Trennzeichen verwenden, &wenn Sie dies lieber in einer einzigen Befehlszeile tun möchten:

$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733

Überprüfen Sie diesen Einzeiler:

$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10

Wieder sehen wir, dass sie alle gleichzeitig laufen. Wenn Sie ein Semikolon verwenden würden:

$ sleep 10 ; sleep 10 ; sleep 10

Die sleep 10Befehle werden nacheinander ausgeführt und benötigen 30 Sekunden. Bei paralleler Ausführung dauert die Ausführung dagegen nur 10 Sekunden.

verwandte Informationen