"subreaper"라는 단어는 일부 답변에 사용됩니다. Google을 검색하면 단어가 "사용 된"항목도 표시됩니다.
"보조자"가 무엇인지 어떻게 알 수 있습니까?
"subreaper"라는 단어는 일부 답변에 사용됩니다. Google을 검색하면 단어가 "사용 된"항목도 표시됩니다.
"보조자"가 무엇인지 어떻게 알 수 있습니까?
답변:
이것은 시스템 호출 prctl () 의 플래그로 Linux 커널 3.4 에 구현되었습니다 .
로부터 prctl(2)
맨 :
[...] 하위 리퍼
init(1)
는 하위 프로세스 의 역할을 수행합니다 . 고아 (즉, 직계 부모가 이미 종료 된) 프로세스를 종료하고 하위 리퍼가있는 것으로 표시되면 가장 가까운 아직 살아있는 조상 하위 리퍼는SIGCHLD
신호 를 수신wait(2)
하고 프로세스에서 종료 상태를 발견 할 수 있습니다 .
프로세스는을 사용하여 자체 하위 요소로 정의 할 수 있습니다 prctl(PR_SET_CHILD_SUBREAPER)
. 그렇다면 init
고아 자식 프로세스 의 부모가되는 것은 (PID 1)이 아니며 하위 하위 로 표시된 가장 가까운 살아있는 조부모가 새 부모가됩니다. 살아있는 조부모가 없다면 그렇습니다 init
.
이 메커니즘을 구현하는 이유는 사용자 공간 서비스 관리자 / 감독자 (같았다 upstart
, systemd
그 시작 서비스를 추적 할) 필요. 많은 서비스는 더블 포킹으로 데몬을 만들고 PID 1로 암시 적으로 재 부모 됩니다. 서비스 관리자는 더 이상 SIGCHLD
신호 를 수신 할 수 없으며 더 이상 자식을 수확 할 책임이 없습니다 wait()
. PID 1이 상위 프로세스를 정리하는 순간 하위에 대한 모든 정보가 손실됩니다. 이제 서비스 관리자 프로세스 자체를 일종의 "sub-init"로 표시 할 수 있으며 이제 시작된 서비스로 작성된 모든 고아 프로세스의 상위로 유지 될 수 있습니다. 모든 SIGCHLD
신호는 서비스 관리자에게 전달됩니다.
Linux에서 데몬은 일반적으로 손자를 포크 한 후 중간 프로세스가 종료 된 상태에서 두 번 포크 하여 작성됩니다 . 이것은 좀비 프로세스 를 피하는 일반적인 기술 입니다. init 스크립트는 자식을 호출합니다. 그 아이는 다시 포크를해서 즉시 나옵니다. 손자는 좀비를 피하기 위해 자녀의 출구 상태를 수집하기 위해 init
지속적으로 전화 wait()
를합니다. 하위 리퍼러 개념을 사용하면 사용자 공간 서비스 관리자가 이제 대신 새 상위가됩니다 init
.