Ich habe ein Bash-Skript geschrieben, das mehrere andere Programme aufruft und eine Reihe von Befehlen ausführt. Ich führe dieses Skript vom Terminal aus. Jetzt möchte ich das Drehbuch töten.
Das Drücken von Ctrl + C
schneidet manchmal nicht ab, weil das Skript manchmal ein anderes Programm ausführt und aus irgendeinem Grund das Kill-Signal nicht funktioniert.
Wenn ich jedoch das Terminalfenster schließe, wird das Skript beendet.
Kann ich etwas tun (eine Tastenkombination), das dem Schließen des Terminalfensters entspricht, ohne das Terminalfenster tatsächlich zu schließen (ich möchte den Befehlsverlauf, das aktuelle Verzeichnis, den Ausgabeverlauf usw. nicht verlieren)?
Ctrl + z
Ctrl + z
Lauf:kill -9 $(pgrep -f your_script.sh)
Antworten:
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: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:In einem anderen Terminal,
In diesem Fall führen
test.sh
Sie die folgenden Schritte aus , um ein Signal an die von erstellte Prozessgruppe zu senden :-INT
wird zum Senden verwendetSIGINT
. Dieser Befehl entspricht dem Drücken CtrlCauf das Terminal. Zu sendenSIGKILL
: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. AllerdingsSIGKILL
kann nicht gefangen werden, und es ist in der Regel eine letztinstanzliche Option. Möglicherweise möchten Sie versuchenSIGTERM
(-TERM
), bevor Sie für die Tötung gehen. WederSIGKILL
oderSIGTERM
kann so eingerichtet werden , wie eine Tastenkombination die Art und WeiseSIGINT
ist.All dies ist umstritten, wenn Ihr Skript keine Shebang-Zeile enthält. Aus dieser SO Antwort :
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.
quelle
SIGKILL
oderSIGTERM
?pgrep test.sh
gibt die PID nicht für mich zurück. Ich habe versucht , eine einfache test.sh:for i in {1..30}; do sleep 1 echo $i done
Währendtest.sh
ausgeführt wird , führe ichpgrep test.sh
in einem anderen Terminal, aber nichts zurückgegeben. Was ist falsch?pgrep -f test.sh
.pgrep -f test.sh
funktioniert auch nicht. Ich./test.sh
Wenn Sie die Prozesse kennen, die mit dem Skript verknüpft sind, können Sie deren PID mithilfe von ermitteln
und verwenden Sie dann die PID-Nummer, um die entsprechenden Prozesse mit abzubrechen
quelle
Wie Harris sagte, können Sie
Kill -9 PID_Number
das Paket ausführen, aber Sie können es auch installierenhtop
, um einen interaktiven Prozessbrowser zu haben, der das Auffinden bestimmter Prozesse erheblich erleichtert. htop unterstützt auch Tötungsprozesse.quelle