NAS의 전송이 간헐적으로 중단됩니다. SIGTERM을 보내면 프로세스 목록에서 사라지지 않고 <defunct>
옆에 레이블이 나타납니다. SIGKILL을 보내도 여전히 사라지지 않고 부모가 이기 때문에 부모를 죽일 수 없습니다 init
. 프로세스를 제거하고 전송을 다시 시작할 수 있는 유일한 방법은 재부팅하는 것입니다.
내가 할 수 있는 최선의 방법은 전송을 수정하려고 노력하는 것이라는 것을 알고 있지만(내가 시도한), 나는 컴파일이 처음이고 토렌트를 조작하기 전에 토렌트가 완료되었는지 확인하고 싶습니다.
답변1
<defunct>
프로세스(좀비 프로세스라고도 함)는 이미 죽었기 때문에 종료할 수 없습니다 . 시스템은 종료 상태를 수집하기 위해 상위 프로세스에 대한 좀비 프로세스를 예약합니다. 상위 프로세스가 종료 상태를 수집하지 않으면 좀비 프로세스는 영원히 유지됩니다. 이러한 좀비 프로세스를 제거하는 유일한 방법은 상위 프로세스를 종료하는 것입니다. 상위 프로세스가 init 상태인 경우에만 다시 시작할 수 있습니다.
좀비 프로세스는 리소스를 거의 차지하지 않으므로 이를 방치해도 성능 비용이 발생하지 않습니다. 좀비 프로세스가 있다는 것은 일반적으로 일부 프로그램에 버그가 있음을 의미합니다. Init는 일반적으로 모든 하위 프로세스를 수집해야 합니다. init에 좀비 자식 프로세스가 있으면 init에 버그가 있는 것입니다(또는 다른 것이지만 그 자체로는 버그입니다).
답변2
Transmission C 소스 코드를 수정하려는 사람은 좀비와 신호 처리기를 피하기 위한 "이중 포크" 트릭과 스마트 가변 생성 기능의 일부로 이를 사용하는 방법에 대해 읽어야 합니다.유닉스에서 생성).
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);
답변3
오늘 저는 init가 소유하고 많은 시스템 리소스를 차지하는 죽은 프로세스를 발견했습니다. 분명히 어딘가에 버그가 있지만 미래의 방문자에게 버그가 가능하다는 사실을 알리고 싶었고 자세한 내용은 Zombie의 스레드를 확인해야 합니다. 바라보다https://stackoverflow.com/questions/22234609/defunct-processes-using-cpu/67840842#67840842