Linux Kill killt nicht
Hi,
ich lese überall, dass der Befehl "kill -9 <pid>" sofort, gnadenlos und *immer* den Prozess mit der angegebenen PID beendet.
Leider nicht auf meinem Ubuntu 14.04 LTS, aktueller Patch Stand (auf einer virtueller Maschine im MS Azure, falls das wichtig ist).
Ich verbinde mich via SSH auf den Server und führe als erstes Kommando tmux aus.
Im tmux starte ich dann mc (Midnight Commander)
Der bleibt aber ab und an mal hängen (und lässt sich dann nicht ein weiteres Mal starten, nur das Fenster friert dann ein, also mache ich das nicht mehr)
Nun kann ich mit CTRL+B+SHIFT+& die tmux Session beenden, was auch klappt, aber da wird der gestartete mc nicht mitgenommen. Auch ein exit und re-connect via SSH hilft da nicht.
Diesen mc will ich nun killen, damit ich ihn wieder verwenden kann:
Nun killen:
mc läuft immer noch. pgrep, ps und pstree sagen nun, dass der mc immer noch läuft
Weiss jemand, was hier schief geht könnte bzw. in welchen Fällen "kill -9" eben doch nicht *immer* killt?
Oder probiert kill über einen längeren Zeitraum zu killen? Davon habe ich aber bisher noch nichts gehört.
Hat jemand eine Erklärung? Ich muss sonst immer den Server neu starten. Das geht zwar sehr schnell, sollte aber eher in der Windows Welt anzutreffen sein
ich lese überall, dass der Befehl "kill -9 <pid>" sofort, gnadenlos und *immer* den Prozess mit der angegebenen PID beendet.
Leider nicht auf meinem Ubuntu 14.04 LTS, aktueller Patch Stand (auf einer virtueller Maschine im MS Azure, falls das wichtig ist).
Ich verbinde mich via SSH auf den Server und führe als erstes Kommando tmux aus.
Im tmux starte ich dann mc (Midnight Commander)
Der bleibt aber ab und an mal hängen (und lässt sich dann nicht ein weiteres Mal starten, nur das Fenster friert dann ein, also mache ich das nicht mehr)
Nun kann ich mit CTRL+B+SHIFT+& die tmux Session beenden, was auch klappt, aber da wird der gestartete mc nicht mitgenommen. Auch ein exit und re-connect via SSH hilft da nicht.
Diesen mc will ich nun killen, damit ich ihn wieder verwenden kann:
- pgrep mc (oder auch ps aux | grep mc)
Nun killen:
- kill -9 <pid-vom-mc>
mc läuft immer noch. pgrep, ps und pstree sagen nun, dass der mc immer noch läuft
Weiss jemand, was hier schief geht könnte bzw. in welchen Fällen "kill -9" eben doch nicht *immer* killt?
Oder probiert kill über einen längeren Zeitraum zu killen? Davon habe ich aber bisher noch nichts gehört.
Hat jemand eine Erklärung? Ich muss sonst immer den Server neu starten. Das geht zwar sehr schnell, sollte aber eher in der Windows Welt anzutreffen sein
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 548496
Url: https://administrator.de/contentid/548496
Ausgedruckt am: 05.11.2024 um 19:11 Uhr
6 Kommentare
Neuester Kommentar
Das kann verschiedene Ursachen haben:
1) Du versuchst einen Prozess zu killen, der nicht dir gehört. Führst du den "kill" auch mit Root-Rechten aus?
2) "kill" ist bei manchen Distributionen in der Bash integriert und hat dann teilweise komische Einschränkungen. Versuche es mal explizit mit "/bin/kill" - das verhindert, dass das Bash-Integrierte "kill" ausgeführt wird sondern das echte.
3) Wenn der Prozess auf I/O wartet (das kann eine Datei sein, aber auch Geräte oder STDIO) kann man ihn nicht herkömmlich unterbrechen, weil der Kernel ihn aufgrund der wartenden File-Handles künstlich am Leben erhält. Es muss dann erst dieser I/O-Vorgang abgeschlossen werden, bis der Prozess wirklich getötet wird.
Das lässt sich manchmal (nicht immer) umgehen, indem man den Prozess mit SIGSEGV wegtötet. Damit wird dem Kernel signalisiert, dass der Prozess einen Segfault verursacht hätte und sowas kann meistens auch wartende I/O-Anforderungen ebenfalls töten.
Probiere mal "/bin/kill -s SIGSEGV $(pidof mc)" - auch hier wieder mit explizitem Aufruf der Binary.
1) Du versuchst einen Prozess zu killen, der nicht dir gehört. Führst du den "kill" auch mit Root-Rechten aus?
2) "kill" ist bei manchen Distributionen in der Bash integriert und hat dann teilweise komische Einschränkungen. Versuche es mal explizit mit "/bin/kill" - das verhindert, dass das Bash-Integrierte "kill" ausgeführt wird sondern das echte.
3) Wenn der Prozess auf I/O wartet (das kann eine Datei sein, aber auch Geräte oder STDIO) kann man ihn nicht herkömmlich unterbrechen, weil der Kernel ihn aufgrund der wartenden File-Handles künstlich am Leben erhält. Es muss dann erst dieser I/O-Vorgang abgeschlossen werden, bis der Prozess wirklich getötet wird.
Das lässt sich manchmal (nicht immer) umgehen, indem man den Prozess mit SIGSEGV wegtötet. Damit wird dem Kernel signalisiert, dass der Prozess einen Segfault verursacht hätte und sowas kann meistens auch wartende I/O-Anforderungen ebenfalls töten.
Probiere mal "/bin/kill -s SIGSEGV $(pidof mc)" - auch hier wieder mit explizitem Aufruf der Binary.