백그라운드 자식 프로세스가 부모 프로세스와 함께 죽나요?

백그라운드 자식 프로세스가 부모 프로세스와 함께 죽나요?

여러 다른 첨자를 호출하는 스크립트가 있습니다. 나중에 종료되어 모든 하위 스크립트가 종료되는 것으로 보입니다.

대부분의 경우 이것이 내가 원하는 것입니다. 하지만 아이가 죽는 것을 원하지 않는 상황이 한두 가지 있습니다.

&스크립트를 호출할 때 를 사용하면 이런 일이 발생하지 않도록 방지 할 수 있었던 기억이 납니다 .

누구든지 이것을 확인할 수 있습니까?

답변1

여기서 고려해야 할 많은 요소가 있습니다. 이 답변을 받아주세요근소한이 모든 세부 사항을 기억에 적었을 때 나는 회의적이었습니다. (오타가 있으면 수정이나 댓글로 알려주세요.)

백그라운드 명령을 사용한 &후 상위 셸이 정상적으로 종료되면 백그라운드 명령이 계속 실행됩니다.

그러나 대화형으로 실행하는 경우 터미널에서 읽거나 쓰려고 할 때 "백그라운드" 명령이 차단됩니다. (이는 상위 쉘이 여전히 실행 중인지 여부에 관계없이 적용됩니다.) stdout, stdin 및 stderr이 리디렉션되는 경우에는 중요하지 않습니다.

백그라운드에 명령을 넣은 후 SSH 세션 연결이 끊어지면 백그라운드 명령이 종료될 수 있습니다. 나는 이것이 귀하의 쉘이 모든 하위 프로세스에 SIGHUP을 보내기 때문이라고 생각하지만 세부 사항을 100% 확신할 수는 없습니다.

작업을 백그라운드로 설정한 후(bash 내장 사용 disown) 거부하면 단순히 SSH 세션이 종료된다고 해서 작업이 종료되지 않습니다. 그러나 터미널에서 쓰거나 읽으려고 할 때 차단되는 측면은 여전히 ​​적용됩니다(대화형 세션의 경우).

내가 아는 가장 일반적인 방법은 백그라운드에서 첨자나 프로세스를 시작하여 이를 생성하는 셸에 무슨 일이 일어나든(대화식으로 시작하든 스크립트에서 시작하든) 영향을 받지 않도록 하는 것입니다.

nohup somecommand >/dev/null 2>&1 </dev/null &

이는 표준 출력이나 표준 오류에 대한 명령 출력에 관심이 없으며 표준 입력을 제공할 필요가 없다고 가정합니다.

하위 스크립트가 상위의 파일 설명자를 상속받는 것이 만족스러우면(즉, 터미널에 문제가 없거나 다른 해결 방법이 있는 경우) 실제로 필요한 것은 다음과 같습니다.

./some-sub-script &
exit

참고로 계속 실행되도록 설계된 데몬을 작성하는 경우제발(a) 통나무를 사용하고 (b) 통나무를 깨끗하게 순환시킵니다.

관련 정보