Zombi süreci nasıl bulunur?


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

Bu zombi işlemini nasıl bulabilirim?


neden sistem monitörünü açıp zombi işlemini aramıyorsunuz?
dlin

8
Bunu başsız bir no-X sunucusunda nasıl yapabilirim?
SabreWolfy

2
Aşağıdaki yanıtların aslında sistemde yukarıdaki çıktılara dayanan bir zombi süreci olmadığını söylemek şaşırtıcı. Gerçekten bir tane olsaydı, ps auxwww | grep 'Z'komut bir Zdurumda bir işlem göstermeliydi . "Sistem bilgisi" demek => There is 1 zombie process.bir hata gibi görünüyor. Ya öyle ya da soruda eksik bilgi var.
arielf

Yanıtlar:


126

Bir zombi öldürmek için (işlem) ana sürecini öldürmek zorundasın (tıpkı gerçek zombiler gibi!), Ancak soru nasıl bulacağımızdı.

Zombi bulmak (soru bu bölümü yanıtladı):

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

Elde ettiğin Zombiler ve içinde Z olan başka bir şey var, o yüzden grep'i alacaksın:

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

Zombinin ebeveynini bul:

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

Sana vereceğim:

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

Bu durumda, bu ebeveyn sürecini öldürmek istemezsiniz ve bir zombiden oldukça mutlu olmalısınız, ancak acil ana işlem 5145'i öldürmek ondan kurtulmalıdır.

Askubuntu hakkında ek kaynaklar:


1
Cevabınızda gösterdiğiniz sonuç, zombi süreci değil, grep komutunun kendisidir. Bu, Pablo'nun cevabında yaptığı yanlış yorumlamanın aynısı. Aşağıda Rinzwind tarafından verilen cevap aslında zombi sürecini arar ve bunları listeler. Başka bir seçenek "
fesat

pstree -H your_desired_pid -p
Greg M. Krsak

Tartışmaya eklediğiniz için teşekkürler Greg, ancak bunun bir yardım sitesi olduğunu lütfen unutmayın, buraya hiçbir şey açıklamadan komut yazmak, yardım almak için gelen çoğu insan için yararlı değildir.
Duncanmoo

1
Bu harika bir cevap! Bugün hala geçerli! Zombi sürecimi bulabildim ve ana sürecini sorunsuz bir şekilde öldürdüm. Teşekkür ederim!
Terrance

1
pstree yüklü değilse ps wauxf, aynı şeyi yapar
JDS

35

Bu soru eski olsa da herkesin daha güvenilir bir cevabı hakettiğini düşündüm:

ps axo pid=,stat=

Bu, biri PID, ikincisi de durum olan, boşlukla ayrılmış iki sütun yayar.

GNU'nun bile psdoğrudan devlet tarafından filtrelemenin bir yolunu sağladığını sanmıyorum , ancak bunu güvenle yapabilirsiniz.awk

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

Artık zombiler olan bir PID listesine sahipsiniz. Durumu bildiğiniz için, artık gösterilmesi gerekmiyor, böylece filtrelenebiliyor.

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

Yeni satır sınırlı bir zombi PID listesi verilmesi.

Artık bu listede basit bir kabuk döngüsü ile işlem yapabilirsiniz.

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

ps güçlü bir araçtır ve süreç bilgisini almak için karmaşık bir şey yapmanıza gerek yoktur.

(Burada farklı işlem durumlarının anlamı - https://unix.stackexchange.com/a/18477/121634 )


2
awkaynı zamanda sadece metni bölmekle kalmayıp aynı zamanda eşleştirilebilen güçlü bir araçtır. +1 ... diğerleri grepgereksiz ve kesin olmayan yerlerde kullandı .
0xC0000022L

şimdi zombi işlemlerinin bir listesi var. onları nasıl öldürürüm?
Chovy

@chovy: Bağımlı olacaktır, ancak genellikle ebeveyni öldürmeyi veya bildirmeyi içerir. Buradaki diğer cevaplar buna giriyor. Yukarıda gösterilen ilmeğin içindeki ana ps -p "$pid" -opid=,ppid=
pid'i

Ebeveyn olacaksa, tüm çocuk süreçlerini öldürmeyecek mi? Sadece bir zombi sürecini öldürmek istiyorum. Pideyi biliyorum.
Chovy

1
ppid=Seçenekler listesine eklemenizi öneririm , bu yüzden ppid elde etmek için ayrı bir komut kullanmanıza gerek yok.
Ding-Yi Chen,

3

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

Gönderen: http://www.cyberciti.biz/tips/killing-zombie-process.html

Yorumlardan gelişmiş bir:

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;

Yine de dikkatli olun: Bu aynı zamanda süreci öldürür.


hala hiçbir şey döndürmez. Sanırım yolum da yanlış değildi.
Pablo

İkinci örnek cehennemce güvenilmez ve eski gereksiz yere ayrıntılı ( ps axo pid=,stat= | awk '$2~/Z/ {print $1}'yerine deneyin ).
Sorpigal

3

Daha az olsa da:

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

Bu, bana, tüm kullanıcıların işlemlerinin bir ormanını (ağaç), herhangi bir tty'de sınırsız genişlikte olan kullanıcı odaklı bir biçimde verin ve bana, 8. sütunun Z içerdiği durumuyla eşleştiği, yukarıdaki ekranın yarısında gösterin ve neden tüm çizgiyi vurgulamıyorsun.

Kullanıcıya yönelik format şu anlama geliyor: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMANDbu yüzden Zombie durumu 8. sütunda görünecek.

Satır numaralarını isterseniz bir Nönce, bir maçta yıldız işareti isterseniz bir atabilirsiniz . Ne yazık ki yıldızın göstermeyeceği çizgiyi vurgulamamayı kullanırsanız , bunun için alan yaratır.pJGJ

Sonunda şuna benzeyen bir şey edinirsiniz:

…
  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.*
…

Bunu takip edebilirsiniz (ve terminalinizin -U Unicode veya -A Ascii'yi beğenip beğenmediğini algılar):

pstree -psS <PID LIST>

VEYA, sadece, lesso ağacı / ormanı hiyerarşi boyunca takip etmek için yukarı okunu kullanın ; bu da “Daha az daha fazlası” yaklaşımıyla önerdiğim şeydi.


0

Sana bu komutu öneriyorum:

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

auxDizeleri kullanmak ve bırakmak, -otam olarak ne istersen onu kullanıp talep edersen gereksiz yere güvenilmezdir . Yerine ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'kullanın.
Sorpigal

-1

İşlem zombilerini listelemek için bu komutu deneyin:

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

$7İşletim sisteminize bağlı olarak değiştirmeniz gerekebilir .

Bu ayrıca üst işlem kimlikleri listesini ( PPID) döndürür .

Zombileri öldürmeye çalışmak için (yukarıdaki komutu test ettikten sonra), şunları deneyin:

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

Ebeveynlerini tanımlamak için şunlarla çalışın pstree:

$ 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)

Bunun için bir sütunu jformattan çıkarmak için başvurmak gereksiz yere karmaşıktır. Kullanım -oyerine ne istediğini seçin.
Sorpigal

2
ps jsistemdeki tüm işlemleri yazdırmaz. Yalnızca geçerli kullanıcı işlemlerini (BSD işleri tarzında) listeler, böylece zombi işlemlerini özleyebilir.
arielf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.