Zombi süreci nasıl öldürülür


184

Programımı ön planda başlattım (bir daemon programı) ve sonra onu öldürdüm kill -9, ancak bir zombi kaldım ve onu öldüremiyorum kill -9. Bir zombi süreci nasıl öldürülür?

Zombi ölü bir süreçse (zaten öldürülmüşse), çıkışından nasıl çıkarırım ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

2
Ne ps -o ppid 1163diyor? Yani, 1163'ün ebeveyni kim? Sonlandırılması gereken süreç budur.
William Pursell

Yanıtlar:


251

Zombi çoktan öldü, onu öldüremezsin. Bir zombi temizlemek için ebeveyn tarafından beklenmesi gerekir, bu yüzden ebeveyn öldürmek zombi ortadan kaldırmak için çalışmalıdır. (Ebeveyn öldükten sonra, zombi pid 1 tarafından miras alınacak ve bu da onu bekleyecek ve işlem tablosundaki girişini temizleyecektir.) Eğer artalanınız zombi olan çocukları doğuruyorsa, bir hatanız var. Daemon'unuz wait, çıkış durumlarını belirlemek için çocukları öldüğünde ve üzerlerinde ne zaman olduğunu fark etmelidir .

Bir zombi ebeveyni olan her işleme nasıl sinyal gönderebileceğinizin bir örneği (bunun son derece kaba olduğunu ve istemediğiniz süreçleri öldürebileceğini unutmayın. Bu tür balyozun kullanılmasını önermiyorum):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
Zombi ölü bir süreçse (zaten öldürülmüşse), çıkışından nasıl çıkarırım ps aux?
MOHAMED

186
Zombi, ebeveyni tarafından bekletilmelidir. Ebeveynini bulun ve ebeveynin neden çocuklarına dikkat etmediğini anlayın, ardından sosyal hizmetlerden şikayetçi olun. ;)
William Pursell

1
Çok sayıda zombi üretme süreciniz olduğunu varsayarsak, kimlikleri 'uniq' etmek mantıklıdır:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon

2
genellikle, eğer üst PPidüste ebeveyni bulabilirsinizcat /proc/<pid>/status
Daniel Andrei Mincă

2
Buraya gelen ve bunu okuyan BT dışı insanların hayalini kurdum. Çılgın.
ZitRo

68

Bir zombi işlemini, üst komutunu aşağıdaki komutla öldürerek temizleyebilirsiniz:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

6
Bu komut, zombi işlem tablosundan temizler, ancak zombi 'öldürmez'. Zombi çoktan öldü.
William Pursell

8
grepGerekli değildir. ps ... | awk '/[zZ]/{print $2}'
William Pursell

2
AFAICS, bu komut zombi öldürmez, ancak SIGHUP'u ana işlemine gönderir (muhtemelen SIGHUP ile ilgilenmiyorsa üst öğeyi öldürür ve zombi'nin önceki yanıtta açıklandığı gibi yeniden başlatılmasına neden olur). Bu komutla dikkatli olun, beklemediğiniz bir şeyi öldürebilir ...
Matthijs Kooijman

1
Bu benim için işe yaramadı. "-HUP processID" öldürdüm ve süreç hala bir zombi olarak orada
kommradHomer

1
@WilliamPursell, bir soruya cevap verirken, komut satırını kullanmanın sonucunu ve açıkça ne yaptığını açıklayın, çünkü bilgisayarda çalışan tüm programları öldürür.
Dalek

39

Denedim:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

bu çalışacak :)


im benim durumum zombi bir başlangıç ​​komut dosyası ve açıkça kaldırıldı böylece kaldırılmayan bir program aracılığıyla oluşturuyordu.
Mohammad Rafiee

1
Benim için çalıştı. Bu, feshedilen işlemin öldürülen başka bir süreç tarafından ortaya çıktığı bazı durumlarda işe yarayacaktır.
Eric S. Bullington

2
Ebeveyn sürecini öldürmeden önce ne kontrol ettim. Ve -1 yerine -9 kullanarak öldürdüm: kill -9 {parent id}
Ali

Ayrıca -1 yerine benimkini öldürmek için -9 kullanmak zorunda kaldım
Michael Smith

28

Http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/ adresinde bulabilirsiniz.

2) Burada başka bir kullanıcıdan harika bir ipucu (Thxs Bill Dandreta): Bazen

kill -9 <pid>

bir süreci öldürmeyecek. Çalıştırmak

ps -xal

4. alan ebeveyn süreci, tüm bir zombi ebeveynleri öldürmek ve zombi ölür!

Misal

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583Zombiler -

kill -9 18581 18582 18583

etkisi yoktur.

kill -9 31706

zombi kaldırır.


3
iyi ki initbenim için öldürdüm ve şimdi hiçbir şey yapamıyorum ve yeniden başlatmak zorunda kalıyorum ... zombi süreci Java, 4GB RAM'den 3.4GB alıyor
Tcll

22

denedim

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

ve benim için çalışıyor.

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.