들어가기 전에

목표는 간단하다.

manage.py runserver로 돌리던 Django 개발 서버를
systemd 서비스로 올리고,
주기적으로 상태를 체크하는 process monitoring을 붙이는 것.

이번에 한 작업은 크게 세 단계였다.

  1. manage.py runserver를 systemd 서비스로 등록
  2. 서비스 상태를 확인하는 체크 스크립트 작성
  3. 그 스크립트를 cron에 올려서 주기적으로 실행

아래는 실제 서버 환경과 함께 정리한 기록이다.


환경 정리

  • OS: Ubuntu (AWS EC2)
  • 프로젝트 루트:
    /home/ubuntu/Q_park_final/Quiz_AI
  • Django 프로젝트 디렉토리 (manage.py 위치):
    /home/ubuntu/Q_park_final/Quiz_AI/testpro
  • 가상환경:
    /home/ubuntu/Q_park_final/Quiz_AI/.venv
  • 목표: python manage.py runserver 0.0.0.0:8000를 systemd 서비스로 실행

1. systemd 서비스로 Django 실행하기

1-1. 서비스 파일 생성

quizai.service라는 이름으로 systemd 유닛 파일을 만들었다.

sudo tee /etc/systemd/system/quizai.service > /dev/null << 'EOF'
[Unit]
Description=Quiz_AI Django Service
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/Q_park_final/Quiz_AI/testpro
Environment="DJANGO_SETTINGS_MODULE=mysite.settings"

ExecStart=/home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/python /home/ubuntu/Q_park_final/Quiz_AI/testpro/manage.py runserver 0.0.0.0:8000

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

핵심 포인트:

  • WorkingDirectory

    • 반드시 절대 경로여야 한다.
    • home/ubuntu/...(X) → /home/ubuntu/...(O)
  • ExecStart

    • 가상환경 파이썬: /home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/python
    • manage.py도 절대 경로로 지정: /home/ubuntu/Q_park_final/Quiz_AI/testpro/manage.py
  • Restart=always

    • 프로세스가 크래시로 죽었을 때 자동 재시작 되도록 설정

DJANGO_SETTINGS_MODULE 값은 testpro/manage.py 상단에 있는 값과 맞춰야 한다. (예: mysite.settings, config.settings 등)


1-2. 서비스 등록 및 시작

서비스 파일을 만든 뒤 systemd에 반영하고 실행했다.

# 서비스 설정 다시 읽기
sudo systemctl daemon-reload

# 부팅 시 자동 시작
sudo systemctl enable quizai.service

# 서비스 시작
sudo systemctl start quizai.service

# 상태 확인
sudo systemctl status quizai.service

정상일 때 출력 예시는 다음과 같다.

● quizai.service - Quiz_AI Django Service
     Loaded: loaded (/etc/systemd/system/quizai.service; enabled; preset: enabled)
     Active: active (running) since Mon 2025-11-17 13:36:13 UTC; 5s ago
   Main PID: 668801 (python)
      Tasks: 4 (limit: 2204)
     Memory: 149.8M (peak: 150.0M)
        CPU: 2.576s
     CGroup: /system.slice/quizai.service
             ├─668801 /home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/python /home/ubuntu/Q_park_final/Quiz_AI/testpro/manage.py runserver …
             └─668803 /home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/python /home/ubuntu/Q_park_final/Quiz_AI/testpro/manage.py runserver …

Nov 17 13:36:14 ip-172-26-15-41 python[668803]: Watching for file changes with StatReloader

여기까지가:

  • 개발 서버를 systemd 서비스로 올리고
  • 백그라운드에서 돌아가게 만든 단계.

1-3. 크래시 자동 재시작 테스트

Restart=always가 실제로 동작하는지 확인하기 위해 일부러 프로세스를 죽여 봤다.

# PID 확인 (manage.py 기준으로)
pgrep -af manage.py

# 확인한 PID로 강제 종료
sudo kill -9 <PID>

이후 status를 다시 보면, 잠깐 실패했다가 다시 active (running) 상태로 돌아온다. journalctl로 보면 이런 로그가 찍힌다.

sudo journalctl -u quizai.service -n 10 --no-pager
  • Main process exited (status 9)
  • 곧바로 “Started quizai.service…” 로그 출력

반대로, sudo systemctl stop quizai.service로 직접 중지시킨 경우에는 “관리자가 의도적으로 끈 것”으로 간주해서 자동 재시작되지 않는다. 이 차이가 실제 운영에서 중요한 포인트.


2. 서비스 상태 체크 스크립트 작성

자동 재시작 설정만으로 끝내지 않고, 주기적으로 서비스 상태를 확인하는 체크 스크립트를 추가했다.

2-1. 스크립트 생성

sudo vim /usr/local/bin/check_quizai.sh

내용:

#!/bin/bash

SERVICE="quizai.service"
LOGFILE="/var/log/quizai_monitor.log"

if ! systemctl is-active --quiet "$SERVICE"; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') $SERVICE is NOT active" >> "$LOGFILE"
fi
  • systemctl is-active quizai.service

    • active가 아니면 로그에 한 줄 남기도록 했다.
  • 나중에는 여기서 systemctl start나 Slack Webhook 호출 등을 추가해서 “자동 복구 + 알림” 기능으로 확장할 수 있다.

실행 권한 부여:

sudo chmod +x /usr/local/bin/check_quizai.sh

수동 테스트:

sudo /usr/local/bin/check_quizai.sh
sudo cat /var/log/quizai_monitor.log

이 시점에 서비스가 정상이라면 로그가 비어 있거나, 이전 테스트에서 찍힌 기록만 보인다.


3. cron으로 주기적인 process monitoring

이제 체크 스크립트를 정해진 주기마다 자동 실행하기 위해 cron에 등록했다.

3-1. root의 crontab 수정

서비스 상태를 보려면 systemctl을 써야 하므로, root의 crontab에 등록했다.

sudo crontab -e

파일 맨 아래에 다음 한 줄 추가:

* * * * * /usr/local/bin/check_quizai.sh
  • 의미: 1분마다 check_quizai.sh 실행
  • 서비스가 active가 아니면 /var/log/quizai_monitor.log에 기록 남김

3-2. 동작 확인

1분 정도 기다린 뒤:

sudo cat /var/log/quizai_monitor.log

예시:

2025-11-17 13:46:01 quizai.service is NOT active

이 줄은 그 시점에 quizai.service가 active가 아니었다는 의미다. (설정 중이거나, 중지 테스트 직후에 찍힌 로그)

서비스를 의도적으로 꺼놓고 테스트할 수도 있다.

# 서비스 중지
sudo systemctl stop quizai.service

# 1~2분 후 로그 확인
sudo cat /var/log/quizai_monitor.log

추가로 한 줄 이상 찍혀 있다면 cron + 스크립트가 정상적으로 동작하는 것.

다시 서비스는 수동으로 시작해준다.

sudo systemctl start quizai.service

4. 정리: 지금 상태에서의 process monitoring 수준

현재 구성된 구조는 다음과 같다.

  1. systemd 서비스 (quizai.service)

    • 서버 부팅 시 자동 시작
    • 프로세스가 크래시로 죽으면 자동 재시작 (Restart=always)
    • systemctl status, journalctl -u로 상태와 로그 확인 가능
  2. 체크 스크립트 (/usr/local/bin/check_quizai.sh)

    • systemctl is-active로 서비스 상태 확인
    • active가 아닐 때만 /var/log/quizai_monitor.log에 기록
  3. cron

    • 1분마다 체크 스크립트 실행
    • 서비스가 죽어 있던 시간대를 로그로 남김

여기까지가 DevOps 관점에서의 기본적인 process monitoring 세팅이다. 여기에 추가로,

  • 체크 스크립트에서 systemctl start까지 해버려서 자동 복구
  • Slack / 이메일 알림 붙이기
  • Prometheus + Grafana 연동으로 시각화

같은 것들을 얹으면 보다 “운영다운” 모니터링 시스템으로 확장할 수 있다.

결론

다음에 할 작업으로는 Performance Monitoring과 Networking Tools, Text Manipulations 을 좀 공부해봐야 할 것 같다.