Ebeveynleri yerinde olan bir <defunct> işlemini nasıl öldürebilirim?


27

İletim zaman zaman NAS'ımda duruyor. SIGTERM'i gönderirsem, işlem listesinden kaybolmaz ve <defunct>yanında bir etiket görünür. Bir SIGKILL gönderirsem, yine de kaybolmaz ve ebeveyni olduğu için ebeveyne son veremem init. İşlemden kurtulup, Transmission'ı yeniden başlatmanın tek yolu yeniden başlatmak.

Yapabileceğim en iyi şeyin, Transmission'u (ve denedim) düzeltmeyi denemek ve düzeltmek olduğunu biliyorum, ancak derlemede acemi olduğumu ve etrafımdakileri karıştırmaya başlamadan önce sellerin bitip bitmediğinden emin olmak istedim.


3
Kimse bariz olduğunu belirtmiyor ... "init" in sahip olduğu bir <defunct> işlemi imkansız olmalı! Bu çok garip bir durum! Emin misiniz?
JoelFan

@JoelFan: Sadece önemli bir şeyi unutmadığımdan emin olmak için bakıyordum. Çocukları olan zombiler initçok hızlı bir şekilde ortadan initkalkmalı, çünkü çocuklara çok sık rastlanan görevlerden biri olduğu için periyodik olarak beklerler ... <defunct>aynı zombilerle aynı mıdır?
D.Shawley

1
boşver ... <defunct>kesinlikle bir zombi ile aynı. initÇocuklarını bekleyecek, böylece teoride asla böyle olmamalı. Sana bir göndermek ne olur acaba SIGCHLDhiç init?
D.Shawley

@JoelFan: evet, eminim. PPID değeri 1 (init) idi, bu yüzden işlemi SIGKILL yapmak imkansızdı.
Andy E,

Yanıtlar:


35

<defunct>Zaten öldüğü gibi bir işlemi (zombi işlemi olarak da bilinir) öldüremezsiniz . Sistem ebeveynin çıkış durumunu alması için zombi işlemlerini sürdürür. Ebeveyn çıkış durumunu toplamıyorsa, zombi süreçleri sonsuza kadar kalır. Bu zombi süreçlerinden kurtulmanın tek yolu ebeveyni öldürmektir. Eğer ebeveyn init ise, sadece yeniden başlatabilirsiniz.

Zombi süreçleri neredeyse hiçbir işe yaramaz, bu yüzden onların dinlenmelerine izin vermede performans maliyeti yoktur. Her ne kadar zombi süreçlerine sahip olmak, genellikle bazı programlarınızda bir hata olduğu anlamına gelir. Init genellikle tüm çocukları toplamalıdır. İnit'in zombi çocukları varsa, init'te bir hata vardır (veya bir başkası ama bir hatadır).

http://en.wikipedia.org/wiki/Zombie_process


9
initasla zombi çocuğu olamaz. Vikipedi makalesinden: Bir süreç ebeveynini kaybettiğinde, init yeni ebeveyn olur. Init, init'li zombileri ebeveyn olarak toplamak için bekleme sistemi çağrısını düzenli aralıklarla yürütür. Biri initbireyin sorumlulukları yetim ve öksüz zombi meyvelerini toplamaya başladı.
D.Shawley

14
@ D.Shawley: initYine de böcek olabilir. İnit değiştirme runitişlemi, bu soruna neden olan bir hata yaptı.
camh

2
init, belki bir böcek yüzünden çocukları feshedebilir, ancak olabilir. Çünkü şu an birine bakıyorum.
studgeek

Terminalden kaçtığım ve durdurulan duruma girdiğim bu program var.
mk ..

6

Transmission C kaynak kodunu düzeltmeye çalışan herkes, zombilerden ve sinyal işleyicilerinden kaçınmak için "çifte çatal" numarası hakkında bir şeyler okumalı ve bunun akıllı variadic spawn işlevinin bir parçası olarak nasıl kullanılabileceğini okumalıdır (bkz . Unix'te Yumurtlama ).

excerpt from: 
   "Spawning in Unix", http://lubutu.com/code/spawning-in-unix

Double fork
This trick lets you spawn processes whilst avoiding zombies, without 
installing any signal handler. The first process forks and waits for its 
child; the second process forks and immediately exits and is reaped;
the third process is adopted by init, and executes the desired program. 
All zombies accounted for, since init is always waiting.

if(fork() == 0) {
   if(fork() == 0) {
       execvp(file, argv);
       exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}
wait(NULL);

1
Çift çatal, çekirdeği ebeveyni temizlemesi beklenen PID 1 'e çekmesi için çekirdeği zorlayarak zombinin işlemlerini önler. Transmission zaten yapmış gibi geliyor, çünkü ebeveyn zaten 1. süreç.
Jander,

1
Burada birden fazla sorun var. # 1: Sadece ebeveyn çağırmalı exit(3); Çocuklar _exit(2)bunun yerine çağırmalı (aksi takdirde diğer konuların yanı sıra çoklu stdio sifonları alırsınız). # 2: Başarısız olursa execvp(3)a kullanabilir perror(3). # 3: signal(SIGCHLD, SIG_IGN)Bütün bu karışıklık yerine sadece kullanmalısın .
Kevin,
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.