ubuntuusers.de

kill-zombie-skript

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Developer92 Team-Icon

Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

So, ich bräuchte mal wieder Hilfe von den Bash-Experten.

Es geht um folgendes: Es schleichen sich hin- und wieder zombie-prozesse bei mir ein. Ich hätte mir gedacht, dass man jetzt ein Skript schreiben könnte, welches die Zombie-Prozesse killt. Mit Cronjob dann alle paar Stunden oder so ☺

Ich denke, das wäre vor allem für Server praktisch. Wobei man dann das ganze erweitern müsste mit Benachrichtigungsfunktion für den Admin.

Jedenfalls, Zombie Prozesse auflisten habe ich mittlerweile:

1
ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Jetzt müsste man je nach Anzahl der vorhandenen Zombie-Prozesse diese killen (mit kill -9 <prozessid>)

Weiß jemand, wie das geht?

Ausgabe des Skriptes sieht übrigens aktuell so aus (kann ja nicht erwarten, dass jeder Zombies daheim hat 😉 ):

Z 16471
Z 17668

mfg

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

TDeveloper schrieb:

So, ich bräuchte mal wieder Hilfe von den Bash-Experten.

Es geht um folgendes: Es schleichen sich hin- und wieder zombie-prozesse bei mir ein. Ich hätte mir gedacht, dass man jetzt ein Skript schreiben könnte, welches die Zombie-Prozesse killt. Mit Cronjob dann alle paar Stunden oder so ☺

Zombies kann man nicht killen, die sind schon tot. Ein Prozess in diesem Zustand besteht nur noch aus seinem Eintrag in der Prozessliste und verbraucht keine Rechenzeit oder Speicher. Der Eintrag ist nur noch deswegen da, weil der Parent (der den jetzigen Zombie irgendwann mal gestartet hat) den Exitcode seines beendeten Kindes noch nicht abgeholt hat. Damit hast du auch einen Ansatzpunkt: sorge dafür das dein Parent ordentlich auf das Ableben seiner Kinder reagiert (mittels Handler auf SIGCHLD) und wait(2) oder waitpid(2) aufruft um die Exitcodes einzusammeln. Dann hast du auch keine Zombies. Alternative um die Zombies loszuwerden - kille den Parent. Dessen Childprozesse werden dann an init weitergegeben, der für alle bereits toten Kinder die Exitcodes abholt und die Zombies so erlöst.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

radoe2 schrieb:

Zombies kann man nicht killen, die sind schon tot. Ein Prozess in diesem Zustand besteht nur noch aus seinem Eintrag in der Prozessliste und verbraucht keine Rechenzeit oder Speicher. Der Eintrag ist nur noch deswegen da, weil der Parent (der den jetzigen Zombie irgendwann mal gestartet hat) den Exitcode seines beendeten Kindes noch nicht abgeholt hat. Damit hast du auch einen Ansatzpunkt: sorge dafür das dein Parent ordentlich auf das Ableben seiner Kinder reagiert (mittels Handler auf SIGCHLD) und wait(2) oder waitpid(2) aufruft um die Exitcodes einzusammeln. Dann hast du auch keine Zombies. Alternative um die Zombies loszuwerden - kille den Parent. Dessen Childprozesse werden dann an init weitergegeben, der für alle bereits toten Kinder die Exitcodes abholt und die Zombies so erlöst.

Okay, dann ist das natürlich was ganz anderes. Deswegen die Frage: Wie bekomm ich den Parent raus? Bei mir ist der Prozess desktopcouch-se regelmäßig zombie. Woher weiß ich, was dessen Parent ist?

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

der Parent-Prozess nützt dir nur etwas, wenn er noch läuft. Du kannst das einfach mit

ps -l

(PPID) nachschauen. Wenn der Parent nicht läuft, muss doch der Zombie ohnehin von init adoptiert worden sein. init bereiningt von Zeit zu Zeit die Process-Table von Zombies. Ggf. Hast du gar kein Problem damit.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

theinlein schrieb:

Hi,

der Parent-Prozess nützt dir nur etwas, wenn er noch läuft. Du kannst das einfach mit

ps -l

(PPID) nachschauen. Wenn der Parent nicht läuft, muss doch der Zombie ohnehin von init adoptiert worden sein. init bereiningt von Zeit zu Zeit die Process-Table von Zombies. Ggf. Hast du gar kein Problem damit.

Okay, danke. Leider ist es bei mir so, dass die Process-Table nicht wirklich von Zombies bereinigt wird. Ich hab wie gesagt immer 2 Dienste, die zombies sind. Ist zum einen der zeitgeist-daemon und zum anderen desktopcouch. Um ehrlich zu sein: Keine Ahnung warum ich die 2 Prozesse überhaupt brauch. Die laufen ständig als Zombies rum und ich hab an meinem System bisher nichts vermisst. Evtl. deinstallier ich auch gleich Zeitgeist. Dann wäre das Problem gelöst ☺

Nur wofür desktopcouch zuständig ist, das muss ich nochmal nachsehen.

mfg

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

Zombies laufen ja nicht. Zombies sind nur Überreste in der Process-Table, die übrigbleiben, weil keiner deren Exit-Stytus abholt. Wenn sie laufen, sind sie ja keine Zombies und deren Eintrag in der process-Table wäre ja berechtigt.

Zombies sind immer Programmierfehler. Wenn du nur 2 Zombies hast, kann dir das aber egal sein. Außer ein paar Bytes in der process-Table ist da nichts an deinem System verloren. Kritisch würde es werden, wenn z.B. alle paar Sekunden ein neuer Zombie entstehen würde und die Process-Table voll läuft und irgendwann dein System lahmlegen würde.

... also: Leg dich wieder hin. 😀

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

theinlein schrieb:

Kritisch würde es werden, wenn z.B. alle paar Sekunden ein neuer Zombie entstehen würde und die Process-Table voll läuft und irgendwann dein System lahmlegen würde.

So wie bei einer Forkbomb? Da hatte ich auch massig Zombie-Einträge in der Systemüberwachung. Durch eine limitierung der User-Prozesse kann man das aber einschränken 😀

... also: Leg dich wieder hin. 😀

Okay, dann betrachte ich das mal als gelöst.

mfg

Antworten |