Linuxpia/Linux 명령어

Django 개발 서버를 SSH 터미널이 끊겨도 계속 실행하려면

easyfly 2026. 9. 4. 14:21
반응형

Django 개발 서버를 SSH 터미널이 끊겨도 계속 실행하려면

Django 개발 서버를 SSH 터미널이 끊겨도 계속 실행되게 하고, 화면에 나오는 내용을 로그 파일에 저장하면서, 백그라운드로 돌리는 명령입니다.

nohup python manage.py runserver 0.0.0.0:8001 > poet_epub.log 2>&1 &

쪼개서 보면 이해가 쉽습니다.

  • nohup
    터미널을 닫거나 SSH 접속이 끊겨도 프로세스가 종료되지 않도록 합니다.
    이름 그대로 “hangup 신호를 무시한다”는 뜻입니다.
  • python manage.py runserver 0.0.0.0:8001
    Django 개발 서버를 실행합니다.
    • manage.py : Django 관리 명령 파일
    • runserver : 개발 서버 실행
    • 0.0.0.0 : 서버의 모든 네트워크 인터페이스에서 접속 허용
    • 8001 : 사용할 포트 번호
  • > poet_epub.log
    원래 터미널 화면에 출력될 정상 메시지를 poet_epub.log 파일로 보냅니다.
  • 예를 들어 원래는 이런 내용이 화면에 보입니다.
Starting development server at http://0.0.0.0:8001/

이제는 화면 대신 poet_epub.log에 저장됩니다.

  • 2>&1
    오류 메시지도 같은 로그 파일로 보냅니다.

여기서 숫자의 뜻은:

1 = 정상 출력
2 = 오류 출력

따라서

2>&1

오류 출력(2)을 정상 출력(1)이 가는 곳과 같은 곳으로 보내라

는 뜻입니다.

결과적으로 정상 메시지와 오류 메시지가 모두

poet_epub.log

에 저장됩니다.

  • 마지막 &
    명령을 백그라운드에서 실행합니다.

&가 없으면 서버가 터미널을 계속 점유합니다. 하지만 &를 붙이면 서버는 뒤에서 실행되고 터미널 프롬프트가 다시 나타납니다.

즉 전체 흐름은 이렇게 됩니다.

Django 서버 실행
        ↓
8001 포트 사용
        ↓
백그라운드 실행
        ↓
SSH 종료되어도 계속 실행
        ↓
출력/오류는 poet_epub.log에 저장

실행하면 보통 이런 식으로 나옵니다.

[1] 482345

여기서 482345는 백그라운드로 실행된 프로세스의 PID입니다.

실행 여부는 다음으로 확인하면 됩니다.

ps aux | grep runserver

또는 더 정확하게:

ss -ltnp | grep 8001

로그를 실시간으로 보고 싶으면:

tail -f poet_epub.log

종료할 때는:

pkill -f "manage.py runserver 0.0.0.0:8001"

또는 PID를 알고 있다면:

kill PID번호

한 가지 중요한 점이 있습니다. nohup은 SSH가 끊겨도 유지되지만, AWS EC2 인스턴스 자체가 재부팅되면 다시 자동으로 살아나지는 않습니다.

 

즉:

SSH 종료 → 유지됨
터미널 닫기 → 유지됨
EC2 재부팅 → 종료됨

 

EC2 재부팅 후에도 자동으로 시작되게 하려면 나중에는 systemd 서비스로 등록하는 것이 가장 좋습니다.

반응형