[unix] 부모가 init 인 <defunct> 프로세스를 어떻게 죽일 수 있습니까?

NAS에서 전송이 간헐적으로 중단됩니다. SIGTERM을 보내면 프로세스 목록에서 사라지지 않고 <defunct>그 옆에 레이블이 나타납니다. SIGKILL을 보내도 여전히 사라지지 않고 부모가이므로 부모를 종료 할 수 없습니다 init. 프로세스를 제거하고 전송을 다시 시작할 수있는 유일한 방법은 재부팅입니다.

내가 할 수있는 최선의 방법은 Transmission을 시도하고 수정하는 것입니다 (그리고 시도했습니다). 그러나 나는 컴파일하는 초보자이며 토런트가 끝나기 전에 토런트를 끝내고 싶었습니다.



답변

<defunct>프로세스가 이미 종료되었으므로 프로세스 (좀비 프로세스라고도 함)를 종료 할 수 없습니다 . 시스템은 부모가 종료 상태를 수집 할 수 있도록 좀비 프로세스를 유지합니다. 부모가 종료 상태를 수집하지 않으면 좀비 프로세스가 영원히 유지됩니다. 좀비 프로세스를 제거하는 유일한 방법은 부모를 죽이는 것입니다. 부모가 초기화되면 재부팅 만 할 수 있습니다.

좀비 프로세스는 리소스를 거의 차지하지 않으므로 성능을 유지하는 데 비용이 들지 않습니다. 좀비 프로세스가 주변에 있다는 것은 일반적으로 일부 프로그램에 버그가 있음을 의미합니다. Init은 일반적으로 모든 어린이를 수집해야합니다. init에 좀비 자식이 있으면 init에 버그가 있습니다 (또는 다른 버그가 있습니다).

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


답변

피하기 좀비와 시그널 핸들러에 “이중 포크”트릭에 대해 읽어야 전송 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);


답변