리눅스 프로세스에 대한 질문
글쓴이: -@Naver / 작성시간: 화, 2021/03/16 - 8:06오후
제가 실험으로 bash에서 test라는 프로그램을 실행하고 bash를
강제 종료시켜 봤습니다 test.c의 코드는
#include <unistd.h> #include <stdio.h> int main(void) { printf("부모 PID : %d\n", getppid()); for(;;); return 0; }
이러합니다.
부모 프로세스의 PID를 출력하고 무한루프를 돌리게 되어 있습니다
실행 결과 부모 PID는 bash의 PID로 나온 것을 확인했고 그 후에
kill -9 [bash의PID] 명령으로 bash를 강제 종료하였더니 test가 같이 꺼졌습니다.
제가 아는 대로라면 부모 프로세스가 자식 프로세스보다 먼저 종료되었으니
test가 고아 프로세스가 되어 부모가 init으로 바뀌고 init에서 wait을 호출하여 test의 종료를
기다릴텐데 왜 test가 같이 종료되는지 궁금합니다
SIGKILL(9)은 시그널 핸들러로 등록할 수 없으므로 bash에서 SIGKILL을 처리할 수도 없을거라고 생각합니다
+(혹시나 해서 ./test &으로 실행시켜봤는데 이 경우에는 bash를 강제 종료해도 정상적으로 init이 부모가 되고
계속 실행됩니다)
Forums:
nohup 등으로 보호하지 않는 이상, 백그라운드
nohup 등으로 보호하지 않는 이상, 백그라운드 작업도 shell과 함께 죽는다고 알고 있었는데, 평소 알고있던 상식과 다른 결과여서 잠시 찾아보니 아래와 같은 글이 나오네요.
https://unix.stackexchange.com/a/318428
shell이 SIGHUP을 받은 경우에만 자식프로스세스들에게 SIGHUP이 전달된다는 뜻같습니다. shell 종료방식 별로 간단히 실험해보니, 해당 shell에서 실행중이던 백그라운드 프로세스들의 운명은 아래와 같았습니다.
[1] putty 등의 터미널 종료버튼을 눌러 끔 (SIGHUP 발생) : 백그라운드 프로세스들도 뒤따라 종료됨
[2] kill -HUP 으로 종료 : 역시 따라 종료됨
[3] exit, ctrl-d, kill -9 등으로 종료 : 백그라운드 프로세스들 유지됨
위의 [1]과 [2]는 SIGHUP 발생 면에서 같은 맥락인 것을 아래 페이지를 통해 알 수 있습니다.
https://en.wikipedia.org/wiki/SIGHUP
다시 읽어보니 질문의 요지는 shell이 죽을 때 왜
다시 읽어보니 질문의 요지는 shell이 죽을 때 왜 자식프로세스가 따라 죽는가였네요. 저는 터미널 환경에서 shell 종료시 모든 자식들은 따라 죽는다고 믿고있었다보니 왜 백그라운드 자식은 안 죽었나에 촛점을 맞춰 딴소리를 했군요.
질문글의 실험을 login shell이 아닌 sub shell에서 해보시면, 포그라운드 자식프로세스도 ppid가 1로 바뀐채로 계속 살아있습니다. 부모프로세스가 죽었을 때의 일반적인 자식프로세스의 행동과 같은 패턴이죠.
그리고, 샘플에서 SIGHUP을 무시하도록 수정하시면 login shell에서도 포그라운드 자식이 죽지 않습니다. 결국 login shell이 SIGKILL로 죽을때 포그라운드 자식만 따라죽은 이유는, 어디선가 포그라운드 자식에게만 SIGHUP이 날아오기 때문인 셈이죠. 아래 페이지의 내용이 참고가 되겠습니다.
https://www.gnu.org/software/libc/manual/html_node/Termination-Internals.html#Termination-Internals
( 링크출처 : https://unix.stackexchange.com/questions/84737/in-which-cases-is-sighup-not-sent-to-a-job-when-you-log-out )
아래와 같이 요약할때, 질문의 답은 [2]가 되겠네요.
(사실 [2]는 shell 뿐 아니라 모든 프로세스의 공통 행동패턴으로 봐야겠습니다)
[1] shell이 SIGHUP을 받으면 백/포그라운드 자식들 모두에게 SIGHUP을 보내고 종료한다.
[2] shell이 다른 이유로 죽게 되면, shell이 터미널의 세션리더인 경우에 한해 포그라운드 자식들에게 SIGHUP을 보내고 종료한다.
댓글 달기