상위 프로세스가 종료 될 때 새 상위 프로세스


22

UNIX에서 부모 프로세스가 사라지면 모든 자식 프로세스가 init를 부모로 재설정한다고 생각했습니다. 이것이 항상 정확하지 않습니까? 예외가 있습니까?

답변:


5

내 의견을 답변으로 옮기는 중 ... 예외가 있다고 생각하지 않습니다.

"때때로 자식 프로세스가 종료되기 전에 부모 프로세스가 종료되는 경우가 있습니다.이 경우"모든 프로세스의 상위 프로세스 " init프로세스가 새 PPID (부모 프로세스 ID)가됩니다. 이러한 프로세스를 고아 프로세스라고도합니다." 출처

마찬가지로 IBM의 블로그에 설명되어 있습니다 . "부모가 자식보다 먼저 죽거나 죽임을 당함. 위의 시나리오에서 자식 프로세스는 고아 프로세스가됩니다 (부모를 잃은 것처럼). Linux에서는 init프로세스가 고아가 처리하고 채택합니다. 이는 자녀가 부모를 잃은 후에 init는 새로운 부모 프로세스가됩니다. "


61

2014 년에 작성된 세 가지 답변은 모두 Unices와 Linux에서 예외없이 프로세스 # 1로 돌아가는 것을 말합니다. 세 가지 오답. ☺

는 AS SUS는 , 다른 답변 중 하나를 인용 말한다 여기에 그래서 나는 다시, 고아의 부모 프로세스가 설정되어 인용하지 않습니다 구현 정의 과정. Cristian Ciupitu는 Linux 문서를 참조하여 구현이 무엇을 정의하는지 확인할 권리가 있습니다. 그러나 그는 일관성이없고 최신이 아닌 그 문서에 의해 잘못 인도되고 있습니다.

이 세 가지 답변이 작성되기 2 년 전,이 답변을 처음 작성할 당시 3 년 전에는 Linux 커널이 바뀌 었습니다. 체계화 된 개발자는 프로세스를 "하위 리퍼러"로 설정할 수있는 기능을 추가했습니다. Linux 3.4부터 프로세스는 옵션을 사용 하여 prctl()시스템 호출을 발행 할 수 PR_SET_CHILD_SUBREAPER있으며 결과적으로 프로세스 # 1이 아닌 프로세스는 독립된 하위 프로세스의 상위가됩니다. 에 대한 매뉴얼 페이지prctl() 는 최신이지만 다른 매뉴얼 페이지는 최신 상태로 유지되지 않고 일관성을 유지했습니다.

버전 10.2에서 FreeBSD는 동일한 기능을 사용하여 기존 procctl()시스템 호출 PROC_REAP_ACQUIREPROC_REAP_RELEASE옵션을 확장했습니다 . DragonFly BSD에서이 메커니즘을 채택했습니다. 버전 4.2에서는 원래 이름이 지정 reapctl()되었지만 개발 중에 이름이 변경되었습니다 procctl().

Linux, FreeBSD / PC-BSD 및 DragonFly BSD에서는 고아가되는 하위 프로세스의 상위 프로세스가 하위 상위 또는 프로세스 # 1로 표시되는 하위 프로세스의 가장 가까운 상위 프로세스로 설정됩니다. 상위 하위 프로세스가없는 경우 systemd (개발자가 처음 Linux 커널에 넣은 유틸리티), upstart 및 nosh를 포함한 다양한 데몬 감독 유틸리티가 service-manager이미이를 사용하고 있습니다.

이러한 데몬 감독자 # 1을 처리하지 않고,이 같은 대화 형 로그인 세션으로 서비스를 급부상하고있는 경우 해당 세션의 하나가 수행에 이중으로 "데몬으로"를 시도의 (아주 생각이 잘못된) 트릭을 fork()보내고 , 다음 하나의 프로세스는 것입니다 프로세스 # 1이 아닌 데몬 감독자의 자식으로 끝납니다. 물론 로그인 세션 내에서 데몬을 직접 스폰 할 수 있다는 것은 근본적인 실수입니다. 그러나 그것은 또 다른 대답입니다.

추가 자료


실제로 고아 프로세스가 세션 시작 (Ubuntu with Upstart)에 연결되는 것을 보았지만 그 중요성을 결코 깨닫지 못했습니다. +1
muru

upstart session init에 대한 자세한 내용은 unix.stackexchange.com/a/194208/5132 를 참조하십시오 .
JdeBP

8

exitThe Single UNIX® Specification, 버전 2 의 매뉴얼 페이지 에 따르면 :

모든 호출 프로세스의 기존 하위 프로세스 및 좀비 프로세스의 상위 프로세스 ID는 구현 종속 시스템 프로세스의 프로세스 ID로 설정됩니다. 즉, 이러한 프로세스는 특수 시스템 프로세스에 의해 상속됩니다.

대부분의 유닉스 변형의 경우 해당 특수 프로세스는 init(PID 1)입니다.

Linux wait(2)매뉴얼 페이지에서이를 확인합니다.

부모 프로세스가 종료되면 "좀비"자식 (있는 경우)이 init (8)에 의해 채택되어 좀비 제거 대기를 자동으로 수행합니다.

FreeBSD wait(2), NetBSD wait(2), OpenBSD wait(2)및 Mac OS X wait(2)매뉴얼 페이지에서도이를 확인할 수 있습니다.

상위 프로세스가 모든 하위 프로세스가 종료되기를 기다리지 않고 종료되면 나머지 하위 프로세스에는 상위 프로세스 1 ID (초기 프로세스 ID)가 지정됩니다.

Oracle Solaris 11.1 wait(3C)매뉴얼 페이지에서도이를 확인합니다.

하위 프로세스가 종료되기를 기다리지 않고 상위 프로세스가 종료되면 각 하위 프로세스의 상위 프로세스 ID는 1로 설정되며 초기화 프로세스는 하위 프로세스를 상속합니다. 참조하십시오 Intro(2).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.