Bir zombi sürecini öldürmenin alternatif yolu


19

CentOS 6.8'de (Final) bazı zombi süreçlerini fark ettim, onları öldürmeye çalıştım ama hala oradalar:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Gördüğünüz gibi iki aydır koşuyorlar ve eğer zararsızlarsa onlardan kurtulurdum, bir Zombi öldürmek için başka bir yol var mı?


1
denedin kill -9mi
Ipor Sircer

7
Sadece 747ve 29971zombi süreçleridir. Diğerleri kilitli olabilir ama henüz ölmediler.
roaima

Tomcat üzerinde çalışan bazı kodlarda bir hata var gibi görünüyor ...
Örümcek Boris

Yanıtlar:


8

Heemayl'ın belirttiği gibi, aslında bir zombi öldüremezsiniz. Zaten öldü ...

Ancak, karşılaştığınız sorun git clonekomutla ilgili bir sorun gibi görünüyor . Bir şekilde takılıyor. Muhtemelen zaman aşımına uğrar veya başka bir şekilde başarısız olur? Genellikle bazı G / Ç nedeniyle bir işlem a'nın çalışmadığı SIGTERMve SIGINTçalışmadığı noktaya yapışır .

Bunu öldürmek için, bu durumda, -9komut satırı seçeneğini kullanmak istersiniz . Bu, SIGKILLsinyali göndermek anlamına gelir . Aslında kullanabilirsiniz -KILL.

[root@host user]# kill -KILL 746 29970

Kullanılabilir sinyallerin bir listesini almak için list komut satırı seçeneğini kullanın.

[root@host user]# kill -l

Bu size sayıları ve adları gösterir (ve # 9'un SIGKILL dediğini göreceksiniz.)


1
Aslında kill -KILLbu işlemleri kapatabilecek tek komut buydu, bu yüzden @Alexis Wilke yanıtını kabul edeceğim. Ama eminim @heemayl hızlı, bilge ve çok bilgilendirici +1 yanıtına şükranlarımı sunacağım. Herkese teşekkürler
lese

39

Bir Zombi'yi (süreci) öldüremezsiniz, zaten öldü. Sadece üst sürecinin wait(2)çıkış durumunu yapmasını ve toplamasını bekliyor . Sistemde işlem tablosu girişi dışında herhangi bir kaynak almaz.

SIGCHLDEbeveynine, çocuklarından birinin sonlandığını bildirmesi için gönderebilirsiniz (yani çocuğun çıkış durumunu toplamasını isteyebilirsiniz). Bu sinyal göz ardı edilebilir (varsayılan değerdir):

kill -CHLD <PPID>

( <PPID>Ebeveynin gerçek PID'si ile değiştirin .)

Veya ana işlemi öldürebilirsiniz, böylece init(PID 1) zombi sürecini devralır ve düzgün bir şekilde biçer ( initherhangi bir yetimi miras almak ve wait(2)düzenli olarak yapmak ana görevlerden biridir ). Ancak ebeveynin öldürülmesi önerilmez. Genellikle, zombi süreçlerinin oluşturulması programlama sorununu / sorunlarını gösterir ve bunun yerine bunu düzeltmeye veya raporlamaya çalışmalısınız.


8
SIGCHLD'u ebeveynine gönderebilir, eğer çocuklarının sonlandırıldığını (yani çocuğun çıkış durumunu toplamasını isteyin), bu sinyal göz ardı edilebilir (varsayılan) Sorun, bir işlem yoksayarsa SIGCHLD, zombi olmamasıdır. yaratılacaktı. Bu yüzden görmezden gelmiyorsa SIGCHLDve zombiler zorlanmıyorsa, süreç ya adamcağız ya da zombi çocuklarını umursamıyor. Söz konusu süreç göz önüne alındığında, git clone ...bahse girerim zombi çocuklarını umursamaz çünkü işini yapan ve sonra çıkan (umarım) kısa ömürlü bir süreçtir.
Andrew Henle

1
@AndrewHenle: Bu çoğunlukla doğru olsa da, için varsayılan eylem ( SIG_DFL) SIGCHILDde yoksaymaktır, ancak bu durumda zombiler kesinlikle otomatik olarak toplanmaz.
R ..

@R Bu çoğunlukla doğru olsa da, için varsayılan eylem ( SIG_DFL) SIGCHILDde yoksaymaktır, ancak bu durumda zombiler kesinlikle otomatik olarak toplanmaz. Ne kastettiğinizden emin değilim. Soruda toplanmayan süreçlerden mi bahsediyorsunuz? (Açık veya varsayılan olarak) işleyicisi ayarlanmış SIGCHLDbir işleme gönderme nasıl bu işlem herhangi bir zombi reap neden olur görmüyorum. SIGCHLDSIG_IGN
Andrew Henle

1
@AndrewHenle, bu sefer bir SIGCHLDişe yarayabilir . Son kez sinyali kaçırmış olabilir veya iki çocuk aynı anda öldü ve kod her iki ölümü aynı anda ele alacak kadar akıllı değil.
Alexis Wilke

Canını yakamaz, ama işe yarayamazdım.
Barmar

2

zombi süreçlerini aramak için:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

zombi sürecini öldürmek için ebeveyn kimliklerinin öldürülmesi gerekir, yani PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

Bir ana işlem öldüğünde, tüm zombi işlemi temizlenir. Sadece zombi sürecini temizlemek için ebeveyn sürecini öldürmeyin. Programınızı yeniden çalıştırdığınızda tekrar gelecektir. Programınızı "wait ()" veya "waitpid ()" sistem çağrısını doğru şekilde arayarak düzeltin.

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.