Передача периодически висит на моем NAS. Если я отправляю SIGTERM, он не исчезает из списка процессов, а <defunct>
рядом с ним появляется метка. Если я отправляю SIGKILL, он все равно не исчезает, и я не могу прекратить родительский, потому что родительский init
. Единственный способ избавиться от процесса и перезапустить Transmission - это перезагрузить компьютер.
Я понимаю, что лучшее, что я могу сделать, это попытаться исправить Transmission (и я пробовал), но я новичок в компиляции, и я хотел убедиться, что мои торренты закончены, прежде чем я начну возиться с ним.
init
должны уходить довольно быстро, такinit
как периодически ждут детей, так как одна из многих его общих задач ... это<defunct>
то же самое, что и зомби?<defunct>
это точно так же, как зомби.init
будет ждать своих детей, так что это никогда не должно происходить в теории. Интересно , что произойдет , если вы отправитьSIGCHLD
вinit
?Ответы:
Вы не можете убить
<defunct>
процесс (также известный как процесс зомби), так как он уже мертв. Система сохраняет процессы зомби для родительского, чтобы собрать статус выхода. Если родитель не получает статус выхода, то процессы зомби останутся навсегда. Единственный способ избавиться от этих зомби-процессов - это убить родителя. Если родителем является init, вы можете только перезагрузиться.Процессы зомби практически не потребляют ресурсов, поэтому нет необходимости снижать производительность. Хотя наличие зомби-процессов обычно означает, что в некоторых ваших программах есть ошибка. Инициировать обычно должны все дети. Если в init есть дети-зомби, значит, в init есть ошибка (или еще какая-то, но она есть).
http://en.wikipedia.org/wiki/Zombie_process
источник
init
никогда не может иметь детей зомби. Из статьи в Википедии: Когда процесс теряет своего родителя, init становится его новым родителем. Init периодически выполняет системный вызов wait, чтобы пожинать зомби с init в качестве родителя. Одна изinit
обязанностей - пожинать сирот и зомби без родителей.init
могут быть ошибки, хотя. У замены initrunit
была ошибка, которая вызывает эту проблему.Любой, кто пытается исправить исходный код Transmission C, должен прочитать об уловке «двойная вилка», чтобы избежать зомби и обработчиков сигналов ... и как ее можно использовать как часть интеллектуальной функции появления переменных (см. Spawning в Unix ).
источник
exit(3)
;_exit(2)
вместо этого дети должны звонить (в противном случае вы получаете несколько сбросов stdio среди других вопросов) # 2: Этоexecvp(3)
может использовать,perror(3)
если это не удается № 3: Вы должны просто использоватьsignal(SIGCHLD, SIG_IGN)
вместо всего этого беспорядка.