ssh로 연결한 세션이 끊어지면 어떻게 될까요?

 

 1.c는 위와 같습니다. 아시다시피, 그냥 의미없이 계속 무한 루프를 도는 코드입니다. 이것을 컴파일 해서 돌려보겠습니다.

 


 

 strace를 찍어볼 겁니다. 여기서, -o 옵션은 파일에다가, trace 내용을 뽑는 것입니다. strace -o trace.txt는 trace.txt에 트레이스를 한 내용을 출력합니다.

 

 

 ssh 접속을 끊은 다음에 다시 접속한 다음에, trace.txt를 열어봅시다. 그러면, SIGHUP라는 내용이 나왔음을 알 수 있습니다.

 

 

 signal(7) 문서를 보면 몇 가지 행동이 나와 있습니다. 이 중에서, Term은, Default action이 process를 종료하는 것임을 뜻합니다. Ign은 무시한다는 의미입니다. 밑에 부분을 보면, signal과 Action, comment가 나와 있습니다.

 

 

 이 중, SIGHUP는 Term입니다. 즉, 프로세스에 SIGHUP 신호가 발생하면, 종료된다는 의미입니다. hang up은 전화를 끊었다고 말할 때 씁니다. 중요한 건 무언가와의 connection이 끊어졌다는 것입니다. 그러면 대략적으로 뜻을 유추할 수 있을 텐데요. 제어 터미널과의 연결이 끊어졌을 때나, 제어 프로세스가 death 상태일 때, 발생한다는 의미가 되겠습니다.

 

 이 상황에서는 ssh로 접속하고 1을 실행한 상황에서, 연결을 바로 종료해 버렸는데요. 이 때, SIGHUP가 발생하면서, default action인 프로세스 종료를 해 버린 셈입니다.

 

 


 그러면 어떻게 해야 ssh로 연결한, 그러니까 제어 터미널과의 연결이 끊겨도 계속 해당 프로세스를 돌릴 수 있을까요? HUP 시그널을 무시하면 되는데, NOHUP 명령어가 그러한 역할을 합니다.

 

 

 man 페이지를 보면, nohup는, hangup을 무시한다고 되어 있습니다. 한 번 실행시켜 보겠습니다.

 

 

 nohup ./1 &은, ./1 &을 hang up을 무시하고 실행시킵니다. ./1은 별 문제는 없을 거고, &가 문제인데요. &은 background로 실행시킨다는 의미입니다. 이것은 나중에 따로 언급을 할 기회가 있을 듯 싶습니다. 이제, 터미널과의 연결을 끊고 다시 접속해 보도록 하겠습니다.

 

 

 다시 접속을 한 다음에, ps -aux | grep ./1$ 명령어를 입력하면, ./1이 아직도 떠 있음을 알 수 있습니다. regex에서 $는, 패턴의 끝을 의미합니다. trace.txt를 열어보겠습니다.

 

 

 그러면, rt_sigaction이 떡하니 있습니다. sa_handler = SIG_IGN이라는 것을 보실 필요가 있는데요. 이것은 SIGHUP가 들어와도 무시한다는 이야기입니다. 그러면 어떻게 종료시켜야 할까요?

 

 


 문서를 계속 읽어보면, SIGKILL과 SIGSTOP은 caught가 되거나, block이 되거나 무시될 수 없다는 문구가 있습니다. 그 중에, 9번 시그널인 SIGKILL은, action이 Term입니다. 그러면, 9번 시그널을 전송하면 되겠네요.

 

 

 리눅스에서 kill은 특정 프로세스에 신호를 보내는 용도로 사용할 수 있습니다. 우리는 7595번 프로세스에게 9번을 보내면 되니, 2번째 인자는 9, 3번째 인자는 7595가 되겠습니다.

 

 

 이 명령어를 수행한 훟에, ./1이 떠 있나 확인하면 없음을 알 수 있습니다. 주요 시그널의 번호 정도는 외울 필요도 있겠네요.