Views: 0
리눅스 서버에서 서비스가 예기치 않게 중단되는 상황은 빈번하다. 이를 방지하려면 자동 재시작 설정이 필수다. 이 글에서는 systemd, supervisor, bash 스크립트를 활용해 서비스 장애 발생 시 자동으로 복구하는 3가지 실무 방법을 구체적으로 정리한다.
목차
서비스 자동 재시작이 필요한 이유
리눅스 서버는 장시간 운영되는 만큼 네트워크 오류, 메모리 누수, 일시적 예외 등으로 프로세스가 멈출 수 있다. 이를 수동으로 재시작하면 운영 효율이 떨어지고 장애 대응 속도도 늦어진다. 자동 재시작 기능을 설정하면 서비스가 죽더라도 즉시 다시 실행되어 가용성과 안정성이 크게 향상된다.
방법 1: systemd의 Restart 옵션 활용
systemd는 현대 리눅스 배포판에서 기본적으로 사용하는 서비스 관리자다. 서비스 유닛 파일의 설정만 수정하면 자동 재시작을 쉽게 적용할 수 있다.
설정 예시
서비스 유닛 파일(/etc/systemd/system/myapp.service)에 다음 내용을 추가하거나 수정한다.
[Service]
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=5
- Restart=always : 프로세스가 어떤 이유로 종료되더라도 항상 재시작
 - RestartSec=5 : 재시작 전 5초 대기
 
이후 설정을 반영한다.
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
sudo systemctl enable myapp.service
systemctl status myapp 명령으로 정상적으로 재시작이 동작하는지 확인할 수 있다.
장점
- 운영체제 수준에서 관리되어 안정적
 - 서비스 로그를 journalctl로 일괄 관리 가능
 - 부팅 시 자동 실행과 결합하기 용이
 
단점
- 설정 변경 시 재적용 절차가 필요
 - 간단한 테스트 환경에서는 다소 설정이 번거로울 수 있음
 
방법 2: Supervisor를 이용한 관리
Supervisor는 여러 프로세스를 동시에 감시하고 자동 재시작 기능을 제공하는 경량 프로세스 관리 도구다. 파이썬 기반 애플리케이션이나 웹 서비스 환경에서 자주 사용된다.
설치 및 설정
우선 Supervisor를 설치한다.
sudo apt install supervisor
그다음 설정 파일(/etc/supervisor/conf.d/myapp.conf)을 작성한다.
[program:myapp]
command=/usr/bin/python3 /opt/myapp/app.py
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
- autostart=true : Supervisor 시작 시 자동 실행
 - autorestart=true : 프로세스 종료 시 자동 재시작
 
설정을 반영하고 실행한다.
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myapp
장점
- 다중 서비스 관리에 유리
 - 로그 파일 분리 가능
 - 실행 중 상태를 명령으로 즉시 확인 가능 (
supervisorctl status) 
단점
- 별도의 프로세스 관리 계층이 추가되어 systemd보다 약간 복잡
 - 운영체제의 부팅 프로세스와 완전 통합되지 않음
 
Supervisor는 특히 Django, Flask, Node.js 등 웹 애플리케이션 서버를 여러 개 띄워야 하는 환경에서 유용하다.
방법 3: Bash 스크립트로 간단한 자동 재시작
가벼운 환경이나 실험용 서버에서는 systemd나 Supervisor 없이도 단순한 bash 스크립트로 재시작 기능을 구현할 수 있다.
예시 스크립트
restart_loop.sh 파일을 작성한다.
#!/bin/bash
while true
do
    /usr/bin/python3 /opt/myapp/app.py
    echo "프로세스가 종료됨, 5초 후 재시작"
    sleep 5
done
스크립트에 실행 권한을 부여하고 백그라운드에서 실행한다.
chmod +x restart_loop.sh
nohup ./restart_loop.sh &
이 스크립트는 프로그램이 종료될 때마다 자동으로 다시 실행한다.
장점
- 매우 간단하고 별도 설정 필요 없음
 - 외부 도구 설치 없이 즉시 적용 가능
 
단점
- 로그 관리 기능 부족
 - 시스템 재부팅 시 자동 시작되지 않음
 - 예외 처리나 프로세스 중복 방지 기능이 부족
 
이 방식은 임시 테스트나 개발 환경에서는 간단히 적용할 수 있지만, 운영 환경에서는 systemd나 Supervisor를 사용하는 것이 안전하다.
어떤 방식을 선택해야 할까
- 운영 서버 : systemd가 기본 선택이다. 서비스와 로그 관리가 안정적이며, 부팅 시 자동 실행까지 지원한다.
 - 다중 프로세스 환경 : Supervisor가 적합하다. 여러 애플리케이션을 하나의 관리 인터페이스로 제어할 수 있다.
 - 테스트용 또는 임시 서비스 : Bash 스크립트가 간단하고 빠르다.
 
운영 환경에서는 systemd를 기반으로 관리하되, 컨테이너 환경이나 앱별 격리가 필요한 경우 Supervisor를 병행하는 방식이 많이 사용된다.
문제 상황 점검 포인트
자동 재시작 설정 후에도 서비스가 다시 올라오지 않는다면 다음을 점검해야 한다.
- 실행 경로 또는 권한 오류
 - 포트 충돌
 - 서비스 내부의 치명적 예외 발생
 - 로그 확인 (
journalctl -u 서비스명,cat /var/log/myapp.err.log) 
systemd의 경우 Restart=on-failure 옵션을 사용하면 정상 종료 시에는 재시작하지 않고 비정상 종료에만 대응하도록 설정할 수도 있다.
마무리
리눅스 서비스의 자동 재시작은 안정적인 시스템 운영의 핵심이다. systemd의 Restart 옵션은 표준적이며, Supervisor는 다중 서비스 제어에 강력하고, Bash 스크립트는 간편하다. 환경에 맞는 방식을 선택해 구성하면 장애 대응 속도를 높이고, 관리자가 수동으로 개입할 필요 없이 시스템을 안정적으로 유지할 수 있다.