Linux/네트워크 및 서비스의 활용

hangup과 nohup

easyfly 2026. 9. 5. 15:40
반응형

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은 단순한 명령어 하나가 아니라, 터미널과 서버 프로그램이 서로 어떤 관계로 동작하는지를 이해하는 좋은 출발점이 됩니다.

반응형