hangup과 nohup — SSH를 닫아도 서버가 계속 도는 이유
리눅스 서버를 처음 다루다 보면 자주 만나는 명령이 있습니다.
nohup python manage.py runserver 0.0.0.0:8001 &
이 명령을 보면 자연스럽게 궁금해집니다.
nohup은 무슨 뜻이고, hangup과는 어떤 관계일까?
핵심부터 말하면 아주 간단합니다.
hangup은 연결이 끊기는 것이고, nohup은 연결이 끊겨도 프로그램이 계속 실행되도록 하는 명령입니다.
1. hangup의 원래 뜻
hang up은 영어로 전화를 끊다는 뜻입니다.
예전 전화기를 생각하면 이해하기 쉽습니다. 통화를 마친 뒤 수화기를 전화기에 내려놓는 행동을 hang up이라고 했습니다.
컴퓨터의 리눅스·유닉스 환경에서도 이 개념이 그대로 이어졌습니다.
터미널이나 원격 접속이 끊어지는 상황을 hangup이라고 표현합니다.
예를 들어 AWS 서버에 SSH로 접속한 뒤 다음 명령을 실행했다고 가정해보겠습니다.
python manage.py runserver 0.0.0.0:8001
이 상태에서 SSH 창을 닫으면 서버 입장에서는 다음과 같은 상황이 됩니다.
사용자 SSH 접속
↓
프로그램 실행
↓
SSH 연결 종료
↓
터미널 연결 끊김
↓
Hangup 발생
이때 실행 중이던 프로그램도 함께 종료될 수 있습니다.
2. SIGHUP이란?
리눅스에서는 프로그램에 여러 종류의 신호(signal)를 보냅니다.
그중 하나가 바로:
SIGHUP
입니다.
풀어쓰면:
Signal Hang Up
즉, 연결이 끊어졌음을 알리는 신호입니다.
터미널이나 SSH 세션이 종료되면 실행 중인 프로그램에 SIGHUP 신호가 전달될 수 있습니다.
프로그램은 이 신호를 받으면 일반적으로 종료될 수 있습니다.
그래서 서버 프로그램을 단순히 다음처럼 실행하면:
python manage.py runserver
SSH를 닫을 때 서버도 함께 종료되는 경우가 생깁니다.
3. nohup이란?
nohup은 다음 두 단어가 합쳐진 표현입니다.
no + hangup
직역하면:
hangup의 영향을 받지 않는다
라는 의미입니다.
즉:
nohup 프로그램
이라고 실행하면 해당 프로그램이 SIGHUP 신호를 무시하도록 실행됩니다.
따라서 SSH 연결을 종료하더라도 프로그램이 계속 실행될 수 있습니다.
4. hangup과 nohup 비교
둘의 관계를 표로 정리하면 다음과 같습니다.
| 구분 | hangup | nohup |
| 의미 | 연결이 끊어짐 | 연결이 끊겨도 계속 실행 |
| 원래 뜻 | 전화를 끊다 | hangup을 무시하다 |
| 리눅스 관련 신호 | SIGHUP | SIGHUP 무시 |
| SSH 종료 시 | 프로그램도 종료될 수 있음 | 프로그램 유지 가능 |
| 서버 운영 | 문제가 될 수 있음 | 장시간 실행에 유용 |
쉽게 표현하면 다음과 같습니다.
hangup
"SSH 연결이 끊어졌습니다."
nohup
"SSH가 끊겨도 나는 계속 실행하겠습니다."
5. Django 서버를 예로 들어보자
Django 개발 서버를 다음과 같이 실행할 수 있습니다.
python manage.py runserver 0.0.0.0:8001
이 경우 터미널을 보면 서버 로그가 계속 출력됩니다.
하지만 SSH 연결을 종료하면 서버도 종료될 수 있습니다.
이를 방지하기 위해 다음처럼 실행합니다.
nohup python manage.py runserver 0.0.0.0:8001 &
이제 SSH를 종료해도 Django 서버는 계속 실행될 수 있습니다.
6. 그런데 왜 &도 붙일까?
다음 명령을 살펴보겠습니다.
nohup python manage.py runserver 0.0.0.0:8001 &
여기에는 두 가지 중요한 요소가 있습니다.
nohup
&
각각 역할이 다릅니다.
nohup은:
SSH가 끊겨도 프로그램을 계속 실행
하게 합니다.
반면 &는:
프로그램을 백그라운드에서 실행
하게 합니다.
따라서:
nohup 프로그램 &
은 다음과 같은 뜻입니다.
터미널 뒤에서 실행하고, SSH 연결이 끊어져도 계속 실행해라.
7. 로그까지 저장하려면
실제 서버에서는 다음 형태를 자주 사용합니다.
nohup python manage.py runserver 0.0.0.0:8001 > poet_epub.log 2>&1 &
이 명령을 나누어 보면:
nohup
→ SSH 종료에도 계속 실행
python manage.py runserver 0.0.0.0:8001
→ Django 서버 실행
> poet_epub.log
→ 정상 출력을 로그 파일에 저장
2>&1
→ 오류 출력도 같은 로그 파일에 저장
&
→ 백그라운드 실행
즉 전체적으로는:
Django 서버를 8001번 포트에서 백그라운드로 실행하고, SSH가 끊겨도 유지하며, 정상 출력과 오류 내용을 모두 poet_epub.log에 저장하라.
는 뜻입니다.
8. 실행 여부 확인
백그라운드에서 잘 실행되고 있는지는 다음 명령으로 확인할 수 있습니다.
ps aux | grep runserver
8001 포트를 실제로 사용하고 있는지 확인하려면:
ss -ltnp | grep 8001
로그를 확인하려면:
tail -f poet_epub.log
를 사용할 수 있습니다.
9. nohup도 만능은 아니다
여기서 중요한 점이 하나 있습니다.
nohup은 SSH 연결 종료에는 강하지만 서버 재부팅까지 견디는 것은 아닙니다.
즉:
SSH 창 닫기
→ 서버 계속 실행
인터넷 연결 끊김
→ 서버 계속 실행 가능
EC2 인스턴스 재부팅
→ 프로그램 종료
입니다.
AWS EC2가 재부팅된 뒤에도 프로그램이 자동으로 시작되게 하려면 systemd 같은 서비스 관리 방식을 사용하는 것이 더 좋습니다.
10. 한 문장으로 기억하기
가장 쉽게 기억하면 이렇습니다.
hangup은 터미널 연결이 끊기는 것이고, nohup은 그 연결이 끊겨도 프로그램을 계속 실행시키는 방법이다.
그리고 서버 작업에서는 다음 조합을 기억해 두면 상당히 유용합니다.
nohup 프로그램 > 로그파일 2>&1 &
예를 들어 Django 서버라면:
nohup python manage.py runserver 0.0.0.0:8001 > poet_epub.log 2>&1 &
이 한 줄에 백그라운드 실행, SSH 종료 대응, 로그 저장이라는 세 가지 기능이 함께 들어 있습니다.
리눅스 서버를 운영하다 보면 nohup은 단순한 명령어 하나가 아니라, 터미널과 서버 프로그램이 서로 어떤 관계로 동작하는지를 이해하는 좋은 출발점이 됩니다.
'Linux > 네트워크 및 서비스의 활용' 카테고리의 다른 글
| Git bundle은 어떤 경우에도 가능할까요? (2) | 2026.09.07 |
|---|---|
| Github를 거치지 않고 브랜치 복사, bundle (1) | 2026.09.06 |
| [GIT] Git에서 추적(track)이란 (2) | 2026.09.01 |
| 라즈베리파이 첫 연결, 호스트명으로 SSH 연결 (4) | 2026.04.03 |
| 와이어샤크(Wireshark) (5) | 2025.10.25 |