System information as of Fri Mar 9 19:40:01 KST 2012
System load: 0.59 Processes: 167
Usage of /home: 23.0% of 11.00GB Users logged in: 1
Swap usage: 0% IP address for eth1: 192.168.0.1
=> There is 1 zombie process.
Graph this data and manage this system at https://landscape.canonical.com/
10 packages can be updated.
4 updates are security updates.
Last login: Fri Mar 9 10:23:48 2012
a@SERVER:~$ ps auxwww | grep 'Z'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
usera 13572 0.0 0.0 7628 992 pts/2 S+ 19:40 0:00 grep --color=auto Z
a@SERVER:~$
Wie finde ich diesen Zombie-Prozess?
ps auxwww | grep 'Z'
Befehl einen Prozess in einemZ
Zustand anzeigen sollen . Das Sprichwort "Systeminformationen"=> There is 1 zombie process.
scheint ein Fehler zu sein. Entweder das, oder es fehlen Informationen in der Frage.Antworten:
Um einen Zombie (Prozess) zu töten, muss man seinen übergeordneten Prozess (genau wie echte Zombies!) Töten, aber die Frage war, wie man ihn findet.
Finde den Zombie (Die Frage beantwortete diesen Teil):
Was du bekommst, sind Zombies und alles andere mit einem Z, also bekommst du auch das grep:
Finde die Eltern des Zombies:
Werde dir geben:
In diesem Fall möchten Sie diesen übergeordneten Prozess nicht beenden, und Sie sollten mit einem Zombie zufrieden sein. Wenn Sie jedoch den unmittelbaren übergeordneten Prozess 5145 beenden, wird dieser Prozess möglicherweise nicht mehr ausgeführt.
Zusätzliche Ressourcen auf askubuntu:
quelle
ps wauxf
dasselbeObwohl diese Frage alt ist, dachte ich, dass jeder eine zuverlässigere Antwort verdient:
Dadurch werden zwei durch Leerzeichen getrennte Spalten ausgegeben, von denen die erste eine PID und die zweite deren Status ist.
Ich denke nicht einmal GNU
ps
bietet eine Möglichkeit, direkt nach Status zu filtern, aber Sie können dies zuverlässig tunawk
Sie haben jetzt eine Liste von PIDs, die Zombies sind. Da Sie den Status kennen, muss er nicht mehr angezeigt werden, damit er herausgefiltert werden kann.
Geben einer durch Zeilenumbrüche getrennten Liste von Zombie-PIDs.
Sie können diese Liste jetzt mit einer einfachen Shell-Schleife bearbeiten
ps
ist ein leistungsfähiges Tool und Sie müssen nichts kompliziertes tun, um Prozessinformationen daraus zu erhalten.(Bedeutung der verschiedenen Prozesszustände hier - https://unix.stackexchange.com/a/18477/121634 )
quelle
awk
ist auch ein leistungsfähiges Werkzeug, das nicht nur Text teilt, sondern auch mit diesem übereinstimmt. +1 ... die anderen verwendet,grep
wo es unnötig und ungenau ist.ps -p "$pid" -opid=,ppid=
ppid=
, die Optionsliste zu erweitern, sodass kein separater Befehl zum Abrufen von ppid erforderlich ist.ps aux | awk '{ print $8 " " $2 }' | grep -w Z
Von: http://www.cyberciti.biz/tips/killing-zombie-process.html
Aus den Kommentaren ein verbesserter:
Achtung: Dieser tötet auch die Prozesse.
quelle
ps axo pid=,stat= | awk '$2~/Z/ {print $1}'
stattdessen).Weniger ist mehr:
Geben Sie mir also eine Gesamtstruktur (einen Baum) der Prozesse aller Benutzer in einem benutzerorientierten Format mit unbegrenzter Breite auf einem beliebigen Tty und zeigen Sie es mir auf einem halben Bildschirm darüber, wo es mit dem Fall übereinstimmt, dass die achte Spalte ein Z und enthält warum nicht die ganze Zeile markieren.
Benutzerorientiertes Format scheint zu bedeuten:
USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND
Der Zombie-Status wird in der 8. Spalte angezeigt.Sie können ein
N
vor dem einwerfen,p
wenn Sie Zeilennummern möchten, und ein,J
wenn Sie ein Sternchen bei der Übereinstimmung möchten. Leider, wenn SieG
die Zeile nicht markieren, die der Stern nicht anzeigt, obwohl erJ
Platz dafür schafft.Am Ende erhalten Sie etwas, das wie folgt aussieht:
Sie könnten dies mit (und es wird feststellen, ob Ihr Terminal -U Unicode oder -A Ascii mag):
ODER verwenden Sie einfach den Aufwärtspfeil
less
, um diesem Baum / dieser Gesamtstruktur durch die Hierarchie zu folgen. Das ist, was ich mit dem Ansatz "Weniger ist mehr" empfohlen habe.quelle
Ich schlage Ihnen diesen Befehl vor:
quelle
aux
und munging Strings aus ist es unnötig unzuverlässig , wenn Sie verwenden können ,-o
und fordern Sie genau das, was Sie wollen. Verwenden Sieps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'
stattdessen.Führen Sie den folgenden Befehl aus, um Prozesszombies aufzulisten:
$7
Je nach Betriebssystem müssen Sie möglicherweise Änderungen vornehmen.Dadurch wird auch die Liste der übergeordneten Prozess-IDs (
PPID
) zurückgegeben.Um zu versuchen, die Zombies zu töten (nach dem Testen des obigen Befehls), versuchen Sie:
Um ihre Eltern zu identifizieren, versuchen Sie es mit
pstree
:quelle
j
ist unnötig kompliziert, eine Spalte aus dem Format zu entfernen . Verwenden Sie-o
, um stattdessen auszuwählen, was Sie möchten.ps j
druckt nicht alle Prozesse im System. Es werden nur die aktuellen Benutzer-Prozesse aufgelistet (im BSD-Jobstil), sodass möglicherweise Zombie-Prozesse übersehen werden.