Vraag Hoe vind je een zombie-proces?


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:~$ 

Hoe dat zombieproces te vinden?


85
2018-03-09 10:44


oorsprong


waarom open je de systeemmonitor niet en zoek je naar het zombieproces? - dlin
Hoe dat te doen op een headless no-X-server? - SabreWolfy
Verrassend dat geen van de antwoorden hieronder zegt dat er geen zombie-proces in het systeem is gebaseerd op de bovenstaande uitvoer. Als er echt een was, de ps auxwww | grep 'Z' opdracht zou een proces in een Z staat. Het zeggen van het "systeeminformatie" => There is 1 zombie process. lijkt een fout te zijn. Of dat, of er ontbreekt informatie in de vraag. - arielf


antwoorden:


Om een ​​zombie (proces) te doden, moet je het ouderproces doden (net als echte zombies!), Maar de vraag was hoe je het kon vinden.

Vind de zombie (De vraag heeft dit deel beantwoord):

a@SERVER:~$ ps aux | grep 'Z'

Wat je krijgt is Zombies en al het andere met een Z erin, dus je krijgt ook de grep:

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
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

Zoek de ouder van de zombie:

a@SERVER:~$ pstree -p -s 93572

Zal je geven:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

In dit geval wil je dat ouderproces niet doden en je zou best blij moeten zijn met één zombie, maar het doden van het directe ouderproces 5145 zou er vanaf moeten komen.

Extra bronnen op askubuntu:


102
2018-05-03 08:39



Het resultaat dat u in uw antwoord laat zien, is de grep-opdracht zelf, niet het zombieproces. Het is dezelfde misinterpretatie als die Pablo in zijn antwoord maakte. Het antwoord van Rinzwind zoekt in feite naar het zombieproces en vermeldt ze. Een andere optie zou kunnen zijn om grep te gebruiken voor "ter ziele gegane" - FvD
pstree -H your_desired_pid -p - Greg M. Krsak
Bedankt Greg voor het toevoegen van de discussie, maar onthoud alsjeblieft dat dit een hulppagina is, gewoon een opdracht plakken zonder iets uit te leggen is niet nuttig voor de meeste mensen die hier komen om hulp te zoeken. - Duncanmoo
Dit is een geweldig antwoord! Het is nog steeds geldig vandaag! Ik kon mijn zombie-proces vinden en het ouderproces zonder problemen beëindigen. Dank je! - Terrance
als je geen pstree hebt geïnstalleerd, ps wauxf doet hetzelfde - JDS


Hoewel deze vraag oud is, vond ik dat iedereen een betrouwbaarder antwoord verdiende:

ps axo pid=,stat=

Hiermee worden twee door spaties gescheiden kolommen uitgezonden, waarvan de eerste een PID is en de tweede de status ervan.

Ik denk zelfs niet GNU ps biedt een manier om rechtstreeks op staat te filteren, maar u kunt dit op betrouwbare wijze doen awk

ps axo pid=,stat= | awk '$2~/^Z/ { print }'

Je hebt nu een lijst met PID's die zombies zijn. Omdat je de status kent, is het niet langer nodig om het weer te geven, dus dat kan worden uitgefilterd.

ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'

Een nieuwe, door lijnen gescheiden lijst met zombie-PID's geven.

U kunt nu op deze lijst werken met een eenvoudige shell-loop

for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; do
    echo "$pid" # do something interesting here
done

ps is een krachtig hulpmiddel en u hoeft niets ingewikkelds te doen om er procesinformatie uit te halen.


26
2018-01-25 20:29



awk is ook een krachtige tool die niet alleen tekst splitst maar ook kan matchen. +1 ... de anderen gebruikt grep waar het onnodig en onnauwkeurig is. - 0xC0000022L
dus nu heb ik een lijst met zombie-processen. hoe vermoord ik ze? - chovy
@chovy: het zal afhangen, maar over het algemeen gaat het om het doden of signaleren van de ouder. Andere antwoorden hier komen op in. Vanuit de hierboven getoonde lus kunt u de parent-pid als volgt vinden: ps -p "$pid" -opid=,ppid= - Sorpigal
als ik wil dat de ouder het niet alle kinderprocessen doodt? Ik wil gewoon het ene zombie-proces doden. Ik ken de knevel. - chovy
@chovy: het gewenste commando is kill -CHLD "$ppid" maar zelfs dit is misschien niet genoeg, lees deze hele post om te begrijpen wat je opties zijn. - Sorpigal


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

Van: http://www.cyberciti.biz/tips/killing-zombie-process.html

Van de commentaren een verbeterde:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print $2}'); do
        kill -9 $every;
    done;
done;

Maar pas op: deze doodt ook het proces.


4
2018-03-09 10:48



nog steeds levert niets op. Ik denk dat mijn weg ook niet verkeerd was. - Pablo


Minder is echter meer:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

Dat is zoiets als, geef me een forest (tree) van alle gebruikersprocessen in een gebruikersgericht formaat met onbeperkte breedte op elke tty en laat het aan mij zien op een half scherm boven waar het overeenkomt met het geval dat de 8ste kolom een ​​Z bevat, en waarom markeer je niet de hele regel.

Gebruikersgericht formaat lijkt te betekenen: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND dus de Zombie-status verschijnt in de 8e kolom.

Je kunt erin gooien N voor de p als u regelnummers wilt, en a J als je een asterisk wilt bij de wedstrijd. Helaas als je het gebruikt G om niet de lijn te markeren die asterisk niet zal laten zien J schept er ruimte voor.

Je krijgt uiteindelijk iets dat eruit ziet als:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: lamblin@pts/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

U kon volg dit op (en het zal detecteren of jouw terminal van -U Unicode of -A Ascii) houdt:

pstree -psS <PID LIST>

OF gewoon, weet u, gebruik de pijl naar boven in less om die boom / bos te volgen door de hiërarchie; dat is wat ik aanbeval met de "Less is more" -benadering.


2
2018-02-14 10:40





Ik stel je deze opdracht voor:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'

0
2018-05-04 15:13



Gebruik makend van aux en er strings uit mungen is onnodig onbetrouwbaar als je kunt gebruiken -o en vraag precies wat je wilt. Gebruik ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }' in plaats daarvan. - Sorpigal


Probeer deze opdracht om proceszombies weer te geven:

ps j | awk '$7 ~ "Z"'

Mogelijk moet u wijzigen $7 afhankelijk van uw besturingssysteem.

Dit zal ook de lijst met hun bovenliggende proces-ID's teruggeven (PPID).

Om te proberen de zombies te doden (na het testen van het bovenstaande commando), probeer je:

kill -9 $(ps j | awk 'NR>1 && $7 ~ "Z" {print $2}')

Probeer met hun ouders te identificeren pstree, graag willen:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)

0
2018-02-19 21:12



Keer terug naar het strippen van één kolom uit de j formaat hiervoor is onnodig ingewikkeld. Gebruik -o om in plaats daarvan te selecteren wat je wilt. - Sorpigal
ps j drukt niet alle processen in het systeem af. Het geeft alleen de huidige gebruikerprocs weer (in BSD-takenstijl), zodat het mogelijk zombie-processen mist. - arielf