Ich möchte mehrere Befehle (Prozesse) auf einer einzigen Shell ausführen. Alle von ihnen haben eine eigene kontinuierliche Ausgabe und hören nicht auf. Laufen sie im Hintergrund bricht Ctrl- C. Ich möchte sie als einen einzigen Prozess ausführen (Subshell, vielleicht?), Um alle mit Ctrl- stoppen zu können C.
Um genau zu sein, möchte ich Komponententests mit mocha
(Überwachungsmodus) ausführen, einen Server ausführen und eine Dateivorbearbeitung (Überwachungsmodus) ausführen und die Ausgabe von jedem in einem Terminalfenster sehen. Grundsätzlich möchte ich vermeiden, einen Task-Runner zu verwenden.
Ich kann es realisieren, indem ich Prozesse im Hintergrund laufen lasse ( &
), aber dann muss ich sie in den Vordergrund stellen, um sie zu stoppen. Ich hätte gerne einen Prozess, um sie zu verpacken, und wenn ich den Prozess stoppe, werden seine "Kinder" gestoppt.
quelle
Antworten:
Um Befehle gleichzeitig auszuführen, können Sie das
&
Befehlstrennzeichen verwenden.Dies wird gestartet
command1
und dann im Hintergrund ausgeführt. Das selbe mitcommand2
. Dann geht escommand3
normal los.Die Ausgabe aller Befehle wird unkenntlich gemacht. Wenn dies für Sie jedoch kein Problem darstellt, ist dies die Lösung.
Wenn Sie später einen separaten Blick auf die Ausgabe werfen möchten, können Sie die Ausgabe jedes Befehls weiterleiten
tee
. Auf diese Weise können Sie eine Datei angeben, in die die Ausgabe gespiegelt werden soll.Die Ausgabe wird wahrscheinlich sehr chaotisch sein. Um dem entgegenzuwirken, können Sie die Ausgabe jedes Befehls mit einem Präfix versehen
sed
.Wenn wir all das zusammenfassen, erhalten wir:
Dies ist eine sehr idealisierte Version dessen, was Sie wahrscheinlich sehen werden. Aber es ist das Beste, was mir derzeit einfällt.
Wenn Sie alle auf einmal stoppen möchten, können Sie das eingebaute Programm verwenden
trap
.Dies wird ausgeführt ,
command1
undcommand2
im Hintergrund undcommand3
im Vordergrund, mit dem Sie es mit läßt töten Ctrl+ C.Wenn Sie den letzten Vorgang mit töten Ctrl+ Cdie
kill %1; kill %2
Befehle ausgeführt werden , weil wir ihre Ausführung im Zusammenhang mit der Aufnahme eines INTERUPT Signal, das Ding durch Drücken geschickt Ctrl+ C.Sie beenden jeweils den 1. und 2. Hintergrundprozess (Ihr
command1
undcommand2
). Vergessen Sie nicht, die Falle zu entfernen, nachdem Sie Ihre Befehle mit beendet habentrap - SIGINT
.Schließe das Monster eines Befehls ab:
Sie könnten natürlich auch einen Blick auf den Bildschirm werfen . Damit können Sie Ihre Konsole in beliebig viele separate Konsolen aufteilen. So können Sie alle Befehle einzeln, aber gleichzeitig überwachen.
quelle
Sie können problemlos mehrere Prozesse gleichzeitig beenden, wenn Sie festlegen, dass sie (und nur sie) in derselben Prozessgruppe ausgeführt werden .
Linux bietet das Dienstprogramm
setsid
zum Ausführen eines Programms in einer neuen Prozessgruppe (auch in einer neuen Sitzung, aber das interessiert uns nicht). (Dies ist machbar, aber ohne kompliziertersetsid
.)Die Prozessgruppen-ID (PGID) einer Prozessgruppe ist die Prozess-ID des ursprünglichen übergeordneten Prozesses in der Gruppe. Übergeben Sie das Negativ der PGID an den
kill
Systemaufruf oder Befehl, um alle Prozesse in einer Prozessgruppe abzubrechen . Die PGID bleibt auch dann gültig, wenn der ursprüngliche Prozess mit dieser PID abbricht (obwohl dies etwas verwirrend sein kann).Wenn Sie die Prozesse im Hintergrund von einer nicht interaktiven Shell ausführen , verbleiben sie alle in der Prozessgruppe der Shell. Nur in interaktiven Shells werden Hintergrundprozesse in einer eigenen Prozessgruppe ausgeführt. Wenn Sie also die Befehle aus einer nicht interaktiven Shell herauslösen, die im Vordergrund bleibt, werden sie alle mit Ctrl+ beendet C. Verwenden Sie die integrierte
wait
Funktion, um die Shell auf das Beenden aller Befehle warten zu lassen.quelle
Ich bin überrascht, dass dies noch nicht der Fall ist, aber meine Lieblingsmethode ist die Verwendung von Subshells mit Hintergrundbefehlen. Verwendungszweck:
(command1 & command2 & command3)
Die Ausgabe ist von beiden sichtbar, alle Bash-Befehle und -Befehle sind weiterhin verfügbar, und ein einziger Ctrl-cBefehl beendet sie alle. Normalerweise starte ich damit gleichzeitig einen Live-Debugging-Client-Dateiserver und einen Back-End-Server, sodass ich beide problemlos beenden kann, wenn ich möchte.
Die Art und Weise dies funktioniert , ist , dass
command1
undcommand2
im Hintergrund einer neuen Sub - Shell - Instanz ausgeführt wird , undcommand3
steht im Vordergrund dieser Instanz, und die Sub - Shell ist , was zuerst das Kill - Signal von einem erhält Ctrl-ckeypress. Es ist fast so, als würde man ein Bash-Skript ausführen, um herauszufinden, wem welcher Prozess gehört und wann Hintergrundprogramme beendet werden.quelle
wait
als letzten Befehl (Befehl3 in Ihrem Beispiel) hinzufügen , können Sie Bereinigungscode ausführen , nachdem der Benutzer Strg-C gedrückt hat .Sie können das Semikolon verwenden
;
oder folgendermaßen&&
vorgehen:quelle
Sie können a verwenden
pipe
. Dadurch werden die Befehle an beiden Enden der Leitung gleichzeitig gestartet. Sie sollten auch in der Lage sein, alle Befehle zu stoppenCTRL-C
.1st command | 2nd command | 3rd command
Wenn Sie die Befehle nacheinander ausführen möchten, können Sie die @ serenesat-Methode verwenden.
quelle