Transmisja zawiesza się sporadycznie na moim serwerze NAS. Jeśli wyślę SIGTERM, nie zniknie z listy procesów, a <defunct>
obok pojawi się etykieta. Jeśli wyślę SIGKILL, nadal nie zniknie i nie mogę zakończyć rodzica, ponieważ rodzic jest init
. Jedynym sposobem, aby pozbyć się procesu i zrestartować Transmisję, jest ponowne uruchomienie.
Zdaję sobie sprawę, że najlepszą rzeczą, jaką mogę zrobić, to spróbować naprawić Transmission (i próbowałem), ale jestem nowicjuszem w kompilacji i chciałem się upewnić, że moje torrenty się skończą, zanim zacznę z tym błądzić.
init
powinny zniknąć dość szybko, ponieważinit
okresowo czeka na dzieci, ponieważ jedno z jego wielu typowych zadań ... jest<defunct>
takie samo jak zombie?<defunct>
jest dokładnie taki sam jak zombie.init
będzie czekać na swoje dzieci, więc teoretycznie nigdy nie powinno się to zdarzyć. Zastanawiam się, co się stanie, jeśli wyślesz wiadomośćSIGCHLD
nainit
adres?Odpowiedzi:
Nie możesz zabić
<defunct>
procesu (znanego również jako proces zombie), ponieważ jest on już martwy. System przechowuje procesy zombie dla rodzica w celu zebrania statusu wyjścia. Jeśli rodzic nie odbierze statusu wyjścia, procesy zombie pozostaną na zawsze. Jedynym sposobem na pozbycie się procesów zombie jest zabicie rodzica. Jeśli rodzic jest init, możesz tylko zrestartować komputer.Procesy zombie nie zajmują prawie żadnych zasobów, więc nie ma kosztu wydajności, pozwalając im pozostać. Chociaż procesy wokół zombie zwykle oznaczają błąd w niektórych programach. Init powinien zwykle zebrać wszystkie dzieci. Jeśli init ma dzieci zombie, to w init jest błąd (lub coś innego, ale to błąd).
http://en.wikipedia.org/wiki/Zombie_process
źródło
init
nigdy nie może mieć dzieci zombie. Z artykułu w Wikipedii: Gdy proces traci swojego rodzica, init staje się jego nowym rodzicem. Init okresowo wykonuje wywołanie systemowe wait, aby czerpać zombie z init jako rodzicem. Jednym zinit
obowiązków jest zbieranie sierot i zombie bez rodziców.init
może mieć jednak błędy. Podczas wymiany initrunit
wystąpił błąd, który powoduje ten problem.Każdy, kto próbuje naprawić kod źródłowy Transmission C, powinien przeczytać o sztuczce polegającej na „podwójnym rozwidleniu”, aby uniknąć zombie i programów obsługi sygnałów ... oraz o tym, jak można jej użyć jako części inteligentnej funkcji odradzania variadic (patrz Odradzanie w Uniksie ).
źródło
exit(3)
; dzieci powinny_exit(2)
zamiast tego zadzwonić (w przeciwnym razie dostaniesz wiele różnych kolorów, między innymi). # 2: Przydałobyexecvp(3)
się,perror(3)
jeśli się nie powiedzie. # 3: Powinieneś użyćsignal(SIGCHLD, SIG_IGN)
zamiast tego całego bałaganu.