일부 답변에서는 "subreaper"라는 단어를 사용했습니다. Google에서 검색하면 "방금 사용됨"이라는 단어도 검색됩니다.
"하위 수확자"가 무엇인지 어떻게 이해합니까?
답변1
이는 다음과 같이 구현되었습니다.리눅스 커널 3.4시스템 호출의 플래그로prctl().
prctl(2)
맨페이지 에서 :
init(1)
[...] Sub-Reaper는 하위 프로세스의 역할을 수행합니다. 고아 프로세스(즉, 직계 부모가 종료됨)가 종료되고 자식 리퍼가 있는 것으로 표시되면 가장 가까운 생존 조상 자식 리퍼가 신호를 받고 해당 프로세스에서 자신의 종료 상태를 발견SIGCHLD
할 수 있습니다 .wait(2)
프로세스는 자신을 하위 리퍼로 정의할 수 있습니다 prctl(PR_SET_CHILD_SUBREAPER)
. 그렇다면 init
(PID 1)이 아니며 고아의 부모가 됩니다.하위 프로세스대신, 하위 수확자로 표시된 가장 가까운 생존 조부모가 새 부모가 됩니다. 살아계신 조부모님이 없다면 init
요.
이 메커니즘을 구현하는 이유는 사용자 공간 서비스 관리자/감독자(예:upstart
,systemd
) 시작하는 서비스를 추적해야 합니다. 많은 서비스가 이중 포크를 통해 데몬화되고 암시적으로 획득됩니다.재육아PID 1로. 서비스 관리자는 더 이상 신호를 수신할 수 없으며 SIGCHLD
더 이상 수집에 대한 책임을 지지 않습니다.wait()
. PID 1 정리가 프로세스를 다시 부모화하면 하위 프로세스에 대한 모든 정보가 손실됩니다. 서비스 관리자 프로세스는 이제 자신을 일종의 "하위 초기화 프로그램"으로 표시할 수 있으며 이제 시작된 서비스에 대해 생성된 모든 고아 프로세스의 상위 프로세스로 남을 수 있습니다. 모든 SIGCHLD
신호는 서비스 관리자에게 전달됩니다.
Linux에서는 일반적으로 다음 명령을 사용하여 데몬 프로세스가 생성됩니다.분기두 번 모두 손자를 포크한 후 중간 프로세스가 종료되었습니다. 피하기 위한 일반적인 기술입니다.좀비 프로세스. 초기화 스크립트는 하위 프로세스를 호출합니다. 해당 자식이 또 포크해서 바로 종료했습니다. 손자는 입양될 예정 이며 좀비를 피하기 위해 후손을 모으는 종료 상태를 init
계속 호출합니다 . wait()
하위 리퍼 개념을 사용하면 사용자 공간 서비스 관리자가 이제 init
.