고립 과정
Orphan process고립된 프로세스는 상위 프로세스가 완료되거나 종료된 컴퓨터 프로세스로, 자체 실행 중인 상태로 유지됩니다.
Unix와 같은
Unix와 같은 운영체제에서는 고립된 프로세스는 구현 정의 시스템 프로세스에 의해 즉시 채택됩니다.커널은 부모 프로세스를 이 프로세스로 설정합니다.이 작업을 재부모화라고 하며 자동으로 수행됩니다.기술적으로 프로세스에는 시스템프로세스가 부모로서 존재하지만 프로세스를 처음 작성한 프로세스는 더 이상 존재하지 않기 때문에 분리프로세스라고 불립니다.다른 시스템에서는 고립된 프로세스가 커널에 의해 즉시 종료됩니다.대부분의 Unix 시스템은 지금까지 고아 양육을 재개하는 시스템프로세스로서 init을 사용해 왔습니다만, 현대의 DragonFly BSD, FreeBSD 및 Linux 시스템에서는 고아 양육 프로세스를 [1][2]init이 아닌 "서브리퍼" 프로세스로 재개할 수 있습니다.
부모 프로세스가 종료되거나 크래시되는 등 프로세스가 의도하지 않게 고립될 수 있습니다.대부분의 Unix 계열 운영체제에서는 프로세스 그룹 메커니즘을 사용하여 우발적인 발생으로부터 보호할 수 있습니다.사용자의 셸과 연계하여 모든 하위 프로세스를 고아로 계속 실행하는 것이 아니라 "행업" 신호(SIGHUP)로 종료하려고 합니다.보다 정확하게는 작업 제어의 일부로서 셸이 종료되었을 때 셸은 "세션 리더"(세션 ID는 프로세스 ID와 동일)이기 때문에 대응하는 로그인 세션이 종료되고 셸은 모든 작업(프로세스 그룹의 내부 표현)에 SAHUP을 전송합니다.
프로세스를 의도적으로 절단하는 것이 바람직할 수 있습니다.일반적으로 장기 실행 중인 작업이 사용자의 주의를 끌지 않고 완료될 수 있도록 하거나 무기한 실행 중인 서비스 또는 에이전트를 시작하는 것이 좋습니다.이러한 프로세스는 (관련된 세션 없이) 특히 무기한 실행 중인 경우 데몬이라고 불립니다.낮은 수준의 접근법은 두 번 포크를 하여 손주에게 원하는 프로세스를 실행하고 즉시 자식 프로세스를 종료하는 것입니다.손자녀 프로세스는 이제 고아가 되어 조부모에게 입양되지 않고 init에 의해 입양됩니다.상위 레벨의 대체 방법은 셸의 행업 처리를 회피합니다.자 프로세스에게 SAHUP을 무시하도록 지시하거나(nohup을 사용), 작업 테이블에서 작업을 삭제하거나 세션 엔드에서 SAHUP을 전송하지 않도록 셸에 지시합니다(어느 경우든 disown을 사용).어떤 경우에도 세션 ID(세션리더, 셸의 프로세스 ID)는 변경되지 않으며 종료된 세션의 프로세스 ID는 모든 고립된 프로세스가 종료되거나 세션 ID를 변경할 때까지(새로운 세션을 시작함으로써) 계속 사용됩니다.setsid(2)
).
시스템 관리를 단순화하기 위해 서비스 래퍼를 사용하여 서비스로 사용하도록 설계되지 않은 프로세스가 시스템 신호에 올바르게 응답하도록 하는 것이 좋습니다.프로세스를 생성하지 않고 계속 실행하는 대체 방법은 터미널 멀티플렉서를 사용하여 분리된 세션(또는 분리된 세션)에서 프로세스를 실행하는 것입니다.이렇게 하면 세션이 종료되지 않고 프로세스가 고립되지 않습니다.
서버 프로세스는 서버 프로세스를 실행한 채로 요구를 실행한 후 요구를 개시한 클라이언트가 예기치 않게 크래쉬 했을 경우에도 고립됩니다.
이러한 고립된 프로세스는 서버 리소스를 낭비하고 서버에 리소스가 부족할 수 있습니다.단, 고아 프로세스 문제에 대한 몇 가지 해결 방법이 있습니다.
- 터미네이션이 가장 일반적으로 사용되는 기술입니다.이 경우 고아가 살해됩니다.
- 환생은 기계가 원격 계산의 부모를 주기적으로 찾아내는 기술입니다. 이 때 고립된 프로세스가 사라집니다.
- 기한 만료는 각 프로세스가 종료되기 전에 완료되는 일정 시간을 할당하는 기술입니다.프로세스가 필요한 경우 할당된 시간이 만료될 때까지 완료 시간을 더 달라고 요청할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "What is a "subreaper" process?".
- ^ "New parent process when the parent process dies".
From Linux 3.4 onwards processes can issue the prctl() system call with the PR_SET_CHILD_SUBREAPER option, and as a result they, not process #1, will become the parent of any of their orphaned descendant processes.
정의 : 부모 프로세스가 종료 또는 종료된 고아 프로세스가 실행되고 있습니다.