Ich möchte zwei Befehle gleichzeitig in Bash auf einem Linux-Computer ausführen. Deshalb ./execute.sh
schreibe ich in mein Bash-Skript:
command 1 & command 2
echo "done"
Wenn ich jedoch das Bash-Skript anhalten und Ctrl+ drücken möchte C, wird nur der zweite Befehl angehalten. Der erste Befehl läuft weiter. Wie stelle ich sicher, dass das gesamte Bash-Skript angehalten wird? Oder wie stoppe ich auf jeden Fall beide Befehle? Weil in diesem Fall, egal wie oft ich Ctrl+ drücke, Cder Befehl weiter ausgeführt wird und ich gezwungen bin, das Terminal zu schließen.
Antworten:
Wenn Sie tippen
das ist gleich
Das heißt, dies führt den ersten Befehl im Hintergrund und dann den zweiten Befehl im Vordergrund aus. Insbesondere bedeutet dies, dass Ihr
echo "done"
Ausdruck nachcommand 2
Fertigstellung auch danncommand 1
erfolgt, wenn noch ausgeführt wird.Sie wollen wahrscheinlich
Dadurch werden beide Befehle im Hintergrund ausgeführt und es wird gewartet, bis beide abgeschlossen sind.
Wenn Sie STRG-C drücken, wird das SIGINT-Signal nur an den Vordergrundprozess gesendet, dh
command 2
in Ihrer Version oderwait
in meiner Version.Ich würde vorschlagen, eine Falle wie folgt zu setzen:
Mit der Falle wird das von STRG-C erzeugte SIGINT-Signal eingefangen und durch die
killgroup
Funktion ersetzt, die alle diese Prozesse abbricht.quelle
set -x
am Anfang Ihres Skripts verwenden, um die ausgeführten Befehle zu drucken.Wenn Sie einen Befehl aus einem Skript in den Hintergrund stellen, wird die PID nicht auf dem Bildschirm angezeigt. Sie können die eingebaute Variable verwenden,
$!
die die PID des letzten Prozesses speichert, damit Sie die PID von Befehl1 erfassen können.würde die PID von command1 wiedergeben.
Bash bietet auch den eingebauten Trap, mit dem Sie eine Folge von Befehlen registrieren können, die ausgeführt werden sollen, wenn bestimmte Signale empfangen werden. Sie können dies verwenden, um den Befehl SIGINT und kill1 abzufangen, bevor Sie das Hauptskript beenden, z
Ctrl CWenn Sie jetzt Befehl 2 ausführen, werden durch das Drücken von Befehl1 und Befehl2 SIGINT gesendet.
quelle
%n
Syntax verwenden, um bestimmte Hintergrundjobs in dieser Shell zu beenden. Normalerweise müssen Siekill %1
den neuesten und einzigen Hintergrundprozess beenden. Verwenden Siejobs
bei mehr Hintergrundprozessen, um die Liste zuerst anzuzeigen.Neuere Versionen von GNU Parallel werden tun, was Sie wollen:
Oder wenn gleich
command
bleibt:Sehen Sie sich das Intro-Video an, um eine kurze Einführung zu erhalten: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Gehen Sie durch das Tutorial (man parallel_tutorial). Du kommandierst mit Liebe dafür.
quelle
Ctrl + C sendet ein SIGINT-Signal an Ihren Front-Prozess
command2
.command1
wird im Hintergrund ausgeführt und ist daher nicht vom Eingabestream betroffen.Wenn Sie tippen
command1 &
, sollte bash Ihnen den Prozess "PID" geben, so etwas wie[1234]
. Um diesen Vorgang abzubrechen, können Sie verwendenkill 1234
. Nun, wenn Sie die PIDs von beidencommand1
undcommand2
(haben, schauen Sie sichps -ef
) haben, können Siekill
sie alle beenden:Ein kleiner Trick wäre, beide Befehle im Hintergrund auszuführen, mit:
Bash gibt Ihnen beide PIDs, die bereit sind, getötet zu werden. Ein weiterer Trick wäre, nach
command1
dem Töten wieder in den Vordergrund zu tretencommand2
:Weitere Informationen finden Sie hier: http://linuxg.net/how-to-manage-background-and-foreground-processes/
quelle