Sie haben nur wenige Möglichkeiten. Eine besteht darin, das Skript zu stoppen ( CtrlZ), die PID des Skripts abzurufen und SIGKILL
an 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 kill
Befehl wird der Prozessleiter folgendermaßen bezeichnet:
kill -PID
Wo PID
ist die Prozess-ID des Skripts?
Beispiel:
Stellen Sie sich ein Skript vor, test.sh
das 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.sh
Sie die folgenden Schritte aus , um ein Signal an die von erstellte Prozessgruppe zu senden :
kill -INT -17802
-INT
wird 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 SIGINT
ist wahrscheinlich der Grund, warum er CtrlCunwirksam ist. Allerdings SIGKILL
kann 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 SIGKILL
oder SIGTERM
kann so eingerichtet werden , wie eine Tastenkombination die Art und Weise SIGINT
ist.
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 pgrep
schlagen fehl.
Verwenden Sie immer eine Shebang-Schnur.
Ctrl + z