포스트

[Server]nohup 명령어를 사용해도 서버가 꺼지는 문제

[Server]nohup 명령어를 사용해도 서버가 꺼지는 문제

리눅스 환경에서 서버를 백그라운드에서 실행시켜놓기 위해 nohup 명령어를 사용했다. 하지만 자꾸 서버가 꺼지는 문제가 발생했고, 그럴 때마다 수동으로 다시 실행시켜주었다. 하지만 이대로면 불침번을 서가며 서버를 켜야할 것 같아 문제 해결에 나섰다.

Vapor 가 문제?

가장 먼저 의심했던건 애석하게도 Vapor 프레임워크였다. 분명 Node.js 서버를 nohup node main.js & 명령어를 통해 백그라운드에서 실행해두었을 땐 멀쩡했는데, Vapor 서버로 바꾸고 나서부터 이런 일이 발생했다고 생각해 Vapor를 의심했다. 하지만 구글링도 해보고 vapor run 명령어에 관련 옵션이 있는지 문서도 찾아보았지만 별다른게 없었다.

터미널 강제종료

그 다음 의심한건 나의 터미널이다. 다시 서버를 구동시키기 위해 터미널로 서버 콘솔에 접속했고, nohup vapor run & 명령어를 통해 백그라운드에서 서버를 구동시켰다. 그리고 잘 동작하는지 서버 로그를 확인하기 위해 tail -f nohup.out 명령어로 로그를 확인하다가 터미널을 강제 종료시켰다.

이 과정에서 터미널을 종료하면 서버가 꺼지는건가? 라는 의문이 들어 실험을 진행했다. 실험 방법은 간단했다.

  1. nohup vapor run & 명령어로 백그라운드에서 서버를 실행시킨다.
  2. 터미널을 강제종료한다.
  3. 즉시 서버 콘솔에 다시 접속해 ps -ef | grep vapor 명령어를 통해 서버 프로세스가 살아있는지 확인한다.

실험 결과 터미널을 강제 종료하면 백그라운드 여부에 관계없이 프로세스가 종료됨을 확인할 수 있었다. 그리고 구글링을 통해 재밌는 사실을 알게 되었다.

우선 nohup 명령어는 리눅스(Linux)에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 계속 동작할 수 있게 해주는 명령어입니다.

원리는 터미널에서 로그아웃이 발생하면 리눅스는 해당 터미널에서 실행한 프로세스들에게 hup signal을 전달하여 종료시키는데, nohup 명령어가 이 hup signal을 무시하는 명령어기 때문에 터미널 연결이 끊어지거나 종료되도 실행했던 프로그램들이 계속 유지될 수 있는 것입니다. 출처

요약하자면 터미널 종료가 아닌 로그아웃을 하면 hup signal이 전달되어도 nohup 명령어가 hup signal을 무시하는 명령어이기 때문에, 꺼지지 않는다는 것 같다.

하지만 강제종료를 하면 정상적으로 이 signal을 무시하지 못해 종료되는 문제였다.

해결 방법

터미널을 강제종료 하지 말고, exit 명령어를 통해 서버 콘솔에서 로그아웃을 하고 터미널을 종료해야 한다.

추가 GPT 답변

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.