"보조자"프로세스 란 무엇입니까?


38

"subreaper"라는 단어는 일부 답변에 사용됩니다. Google을 검색하면 단어가 "사용 된"항목도 표시됩니다.

"보조자"가 무엇인지 어떻게 알 수 있습니까?


3
나는 전에 그 말씀을들은 적이 없다. 컨텍스트에 대한 참조를 포함시킬 수 있습니까?
Celada

5
여기 하나가 있습니다 : unix.stackexchange.com/a/177361/5132 의 답변에 사용했습니다 .
JdeBP

아마도 serverfault 대신에 여기에 게시해야했던 관련 질문 serverfault.com/questions/747070/…
artfulrobot

답변:


49

이것은 시스템 호출 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.


프로세스가 "하위"프로세스를 "수행"한다고 생각할 수 있습니까? 아니면, "주"사신이 초기화 되었기 때문에 프로세스가 "하위"사신입니까? 용어가 어떻게 만들어 졌는지 생각하려고 노력했습니다. 답변 해주셔서 감사합니다!
kenchew

3
위 의 Linux 커널 3.4 링크 다음에이 구현에 대한 커밋 주석 에 자세한 내용이 있습니다. (자식 주석에 숨겨진 세부 사항에 의해 두려워)
kenchew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.