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 sleep
zeigt, dass alle drei Hintergrundbefehle gleichzeitig ausgeführt werden.
NOTIZ:Ich habe die Notation echo "X" && sleep 10
einfach 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 10
Befehle 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 10
Befehle werden nacheinander ausgeführt und benötigen 30 Sekunden. Bei paralleler Ausführung dauert die Ausführung dagegen nur 10 Sekunden.