1. SSH 연결을 끊으면 실행 중이던 앱도 종료된다
처음 서버에서 앱을 실행할 때 이런 경험을 합니다. python3 app.py를 실행하고 SSH 세션을 닫으면, 앱도 함께 종료됩니다. 다음 날 서버에 접속해 보면 앱이 꺼져 있습니다.
이것은 버그가 아니라 리눅스의 정상 동작입니다. SSH 세션이 종료되면 해당 세션에서 시작된 모든 프로세스에 종료 신호가 전달됩니다.
서버에서 앱을 24시간 동안 지속적으로 실행하려면 이 동작을 우회해야 합니다.
2. SIGHUP이란 무엇인가?
SSH 세션이 종료될 때 시스템은 해당 세션의 모든 자식 프로세스에게 SIGHUP(Signal Hangup) 신호를 보냅니다. 원래 전화 모뎀이 연결을 끊을 때(hangup) 전달하던 신호에서 유래했습니다.
대부분의 프로세스는 SIGHUP을 받으면 기본적으로 종료됩니다. nohup의 역할은 바로 이 SIGHUP 신호를 **무시(no hangup)**하도록 프로세스를 실행하는 것입니다.
3. 백그라운드 실행 – & 기호 사용법
명령어 끝에 &를 붙이면 백그라운드에서 실행됩니다. 터미널이 바로 반환되어 다른 작업을 계속할 수 있습니다.
python3 app.py &
실행하면 PID(프로세스 ID)가 출력되고 터미널 프롬프트가 바로 나타납니다.
하지만 &만으로는 SSH 세션을 닫으면 프로세스도 함께 종료됩니다. SIGHUP을 막지 못하기 때문입니다.
4. nohup 명령어 완전 이해
nohup은 프로세스가 SIGHUP 신호를 무시하도록 설정하는 명령어입니다. 앞에 붙여서 사용합니다.
nohup python3 app.py
이 명령어를 실행하면 두 가지 일이 일어납니다. SIGHUP 신호가 전달돼도 프로세스가 계속 실행됩니다. 표준 출력이 자동으로 현재 디렉토리의 nohup.out 파일에 저장됩니다.
하지만 이 상태는 아직 포그라운드 실행입니다. 터미널이 여전히 해당 프로세스에 묶여 있습니다.
5. nohup과 &를 조합하는 방법
nohup과 &를 함께 사용하면 SSH가 끊겨도 프로세스가 유지되고, 터미널도 즉시 반환됩니다.
nohup python3 app.py &
실행 후 PID가 출력되고 프롬프트가 돌아옵니다. SSH 세션을 닫아도 프로세스는 계속 동작합니다.
출력 로그를 별도 파일에 저장하고 싶다면 리다이렉션을 추가합니다. 2>&1은 표준 오류(stderr)도 함께 파일에 기록한다는 의미입니다.
nohup python3 app.py > /var/log/myapp.log 2>&1 &
6. 실행 중인 백그라운드 프로세스 관리
프로세스 목록 확인 현재 실행 중인 프로세스를 확인합니다.
ps aux | grep python3
프로세스 종료 PID를 확인하고 kill 명령으로 종료합니다.
kill 프로세스PID
응답이 없을 때 강제 종료합니다.
kill -9 프로세스PID
현재 터미널의 백그라운드 작업 확인 jobs 명령으로 현재 세션의 백그라운드 작업 목록을 봅니다.
백그라운드 작업을 포그라운드로 가져오기 fg %작업번호 명령으로 백그라운드 작업을 포그라운드로 전환할 수 있습니다.
7. Node.js라면 PM2를 쓰는 게 훨씬 낫다
Node.js 앱을 운영한다면 nohup보다 **PM2(Process Manager 2)**를 사용하는 것이 훨씬 효율적입니다.
PM2는 프로세스 매니저로 nohup이 제공하지 못하는 기능을 제공합니다. 앱이 오류로 종료되면 자동으로 재시작합니다. 로그를 파일로 관리하고 pm2 logs 명령으로 쉽게 확인할 수 있습니다. 서버 재부팅 후 자동 시작 설정이 가능합니다. 클러스터 모드로 여러 CPU 코어를 활용할 수 있습니다.
PM2 전역 설치입니다.
npm install -g pm2
앱 시작입니다.
pm2 start app.js –name myapp
서버 재부팅 후 자동 시작 등록입니다.
pm2 startup pm2 save
실행 중인 앱 목록 확인입니다.
pm2 list
8. 정리 및 다음 단계
오늘 배운 핵심을 정리합니다.
- SSH 세션이 종료되면 SIGHUP 신호가 전달되어 프로세스도 함께 종료됩니다.
&는 백그라운드 실행이지만 SSH 종료 시 함께 종료됩니다.- nohup은 SIGHUP 신호를 무시해 SSH 종료 후에도 프로세스를 유지합니다.
- 실전에서는
nohup 명령어 &형태로 둘을 조합해 사용합니다. - Node.js 앱이라면 자동 재시작, 로그 관리까지 지원하는 PM2 사용을 권장합니다.
다음 글에서는 rsync와 cron을 활용해 서버 백업을 완전 자동화하는 방법을 알아보겠습니다.