리눅스 환경에서 서버를 백그라운드에서 실행시켜놓기 위해 nohup 명령어를 사용했다.
하지만 자꾸 서버가 꺼지는 문제가 발생했고, 그럴 때마다 수동으로 다시 실행시켜주었다.
하지만 이대로면 불침번을 서가며 서버를 켜야할 것 같아 문제 해결에 나섰다.
Vapor 가 문제?
가장 먼저 의심했던건 애석하게도 Vapor 프레임워크였다.
분명 Node.js 서버를 nohup node main.js &
명령어를 통해 백그라운드에서 실행해두었을 땐 멀쩡했는데, Vapor 서버로 바꾸고 나서부터 이런 일이 발생했다고 생각해 Vapor를 의심했다.
하지만 구글링도 해보고 vapor run
명령어에 관련 옵션이 있는지 문서도 찾아보았지만 별다른게 없었다.
터미널 강제종료
그 다음 의심한건 나의 터미널이다.
다시 서버를 구동시키기 위해 터미널로 서버 콘솔에 접속했고, nohup vapor run &
명령어를 통해 백그라운드에서 서버를 구동시켰다. 그리고 잘 동작하는지 서버 로그를 확인하기 위해 tail -f nohup.out
명령어로 로그를 확인하다가 터미널을 강제 종료시켰다.
이 과정에서 터미널을 종료하면 서버가 꺼지는건가? 라는 의문이 들어 실험을 진행했다.
실험 방법은 간단했다.
nohup vapor run &
명령어로 백그라운드에서 서버를 실행시킨다.- 터미널을 강제종료한다.
- 즉시 서버 콘솔에 다시 접속해
ps -ef | grep vapor
명령어를 통해 서버 프로세스가 살아있는지 확인한다.
실험 결과 터미널을 강제 종료하면 백그라운드 여부에 관계없이 프로세스가 종료됨을 확인할 수 있었다. 그리고 구글링을 통해 재밌는 사실을 알게 되었다.
우선 nohup 명령어는 리눅스(Linux)에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 계속 동작할 수 있게 해주는 명령어입니다.
원리는 터미널에서 로그아웃이 발생하면 리눅스는 해당 터미널에서 실행한 프로세스들에게 hup signal을 전달하여 종료시키는데, nohup 명령어가 이 hup signal을 무시하는 명령어기 때문에 터미널 연결이 끊어지거나 종료되도 실행했던 프로그램들이 계속 유지될 수 있는 것입니다.
출처
요약하자면 터미널 종료가 아닌 로그아웃을 하면 hup signal이 전달되어도 nohup 명령어가 hup signal을 무시하는 명령어이기 때문에, 꺼지지 않는다는 것 같다.
하지만 강제종료를 하면 정상적으로 이 signal을 무시하지 못해 종료되는 문제였다.
해결 방법
터미널을 강제종료 하지 말고, exit
명령어를 통해 서버 콘솔에서 로그아웃을 하고 터미널을 종료해야 한다.
추가 GPT 답변
'iOS' 카테고리의 다른 글
Tuist 없이 모듈 만들기 with DemoApp (0) | 2024.11.07 |
---|---|
네이버 클라우드 VPC 서버에 연결이 되지 않는 문제 (0) | 2024.11.03 |
Swift Concurrency - Sendable (2) | 2024.10.25 |
Swift Concurrency - Task (1) | 2024.10.24 |
Swift Task 내에서 weak self를 붙여야 하는가 (4) | 2024.10.20 |