Sie haben nur wenige Möglichkeiten. Eine besteht darin, das Skript zu stoppen ( CtrlZ), die PID des Skripts abzurufen und SIGKILLan die Prozessgruppe zu senden .
Wenn ein Befehl in einer Shell ausgeführt wird, ist der Prozess, den er startet, und alle untergeordneten Prozesse Teil derselben Prozessgruppe (in diesem Fall der Vordergrundprozessgruppe). Um ein Signal an alle Prozesse in dieser Gruppe zu senden, senden Sie es an den Prozessleiter. Für den killBefehl wird der Prozessleiter folgendermaßen bezeichnet:
kill -PID
Wo PIDist die Prozess-ID des Skripts?
Beispiel:
Stellen Sie sich ein Skript vor, test.shdas einige Prozesse startet. Angenommen, Sie haben es in einer Shell ausgeführt:
$ ./test.sh
In einem anderen Terminal,
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
In diesem Fall führen test.shSie die folgenden Schritte aus , um ein Signal an die von erstellte Prozessgruppe zu senden :
kill -INT -17802
-INTwird zum Senden verwendet SIGINT. Dieser Befehl entspricht dem Drücken CtrlCauf das Terminal. Zu senden SIGKILL:
kill -KILL -17802
Sie müssen das Skript nur anhalten, wenn Sie kein anderes Terminal öffnen können. Wenn Sie können, verwenden Sie pgrep, um die PID zu finden.
Einer der Befehle, die das Skript startet, ist möglicherweise ein Überfüllungsbefehl. Dies SIGINTist wahrscheinlich der Grund, warum er CtrlCunwirksam ist. Allerdings SIGKILLkann nicht gefangen werden, und es ist in der Regel eine letztinstanzliche Option. Möglicherweise möchten Sie versuchen SIGTERM( -TERM), bevor Sie für die Tötung gehen. Weder SIGKILLoder SIGTERMkann so eingerichtet werden , wie eine Tastenkombination die Art und Weise SIGINTist.
All dies ist umstritten, wenn Ihr Skript keine Shebang-Zeile enthält. Aus dieser SO Antwort :
Normalerweise vermutet die übergeordnete Shell, dass das Skript für dieselbe Shell geschrieben wurde (minimale Bourne-ähnliche Shells führen das Skript mit / bin / sh aus, bash führt es als bash-Unterprozess aus) ...
Aus diesem Grund finden Sie bei der Ausführung des Skripts keinen nach Skript benannten Prozess (oder einen Prozess mit dem Namen des Skripts in der Befehlszeile) und pgrepschlagen fehl.
Verwenden Sie immer eine Shebang-Schnur.
Ctrl + z