Wie verwende ich Strg + C, um alle Hintergrundprozesse zu beenden, die in einem Bash-Skript gestartet wurden?

4485
Ievgen

ArchLinux (Manjaro).

Ich verwende eine Bash-Datei. Es führt 2 Prozesse (Befehle) aus &. Wenn ich jedoch Ctrl+ drücke C, um das Programm zu stoppen, stirbt ein Prozess und der andere arbeitet weiter.

Wie stoppe ich beide Prozesse? Oder wie schreibe ich ein neues Skript, um diese beiden Prozesse zu beenden?

5

2 Antworten auf die Frage

7
lyang

Das kaufmännische Und & führt einen Befehl in einem neuen Prozess im Hintergrund aus. Wenn der übergeordnete Prozess (in Ihrem Fall der Befehl, mit dem das Bash-Skript ausgeführt wird) endet, setzt dieser Hintergrundprozess seinen übergeordneten Prozess auf init (Prozess mit PID1) zurück, stirbt jedoch nicht. Wenn Sie drücken ctrl+c, senden Sie ein Interrupt-Signal an den Vordergrundprozess, und der Hintergrundprozess wird dadurch nicht beeinflusst.

Um den Hintergrundprozess zu beenden, sollten Sie den killBefehl mit dem PIDneuesten Hintergrundprozess verwenden, den Sie mit erhalten können $!.

Wenn Sie möchten ctrl+c, dass sowohl das Skript als auch der Hintergrundprozess beendet werden, können Sie Folgendes tun:

trap 'kill $BGPID; exit' SIGINT sleep 1024 & # background command BGPID=$! sleep 1024 # foreground command of the script 

trapändert den Trap-Handler des, SIGINTso dass das Skript den Prozess mit beendet, $BGPIDbevor es beendet wird.

1
Romano

Programme können Ctrl+cSignale ignorieren, da sie auch SIGTSTP ignorieren können

Sie können es Ctrl+zin den meisten Muscheln ausprobieren (nicht immer, aber meistens)

Es gibt einige Signale, die vom Prozess nicht ignoriert werden können: SIGKILL, SIGSTOP. Sie können den Kill-Befehl senden. Um den eingefrorenen Prozess zu beenden, müssen Sie die Prozess-ID (PID) suchen.
benutze pgrep oder ps und töte es dann

 % kill -9 PID