여러 개의 서비스를 동시에 운영해야 하는 상황에서 개별 터미널로 일일이 실행하는 것은 비효율적입니다. 본 가이드에서는 Python 메인 서비스, 보조 모듈, Celery 스케줄러, 그리고 Spring Boot 애플리케이션을 supervisord 하나로 묶어 관리하는 방법을 살펴봅니다.
설치 및 환경 구성
가상 환경 내부에 supervisord를 설치하면 매번 환경을 활성화해야 하는 번거로움이 있습니다. Anaconda 기준으로 base 환경에 설치하여 전역에서 바로 사용할 수 있게 구성합니다.
pip install supervisor
설정 파일 구성
기본 설정 파일 생성 명령을 프로젝트 루트로 redirect하여, 관리 포인트를 줄입니다.
echo_supervisord_conf > /home/alex/project_root_path/supervisord.conf
supervisord 본체 설정
핵심은 로그 경로 지정입니다. 아래는 서비스 자체의 실행 기록을 남기는 설정이며, 개별 프로그램의 출력 로그와는 별개입니다.
[supervisord]
logfile=/home/alex/project_root_path/supervisord.log
개별 프로그램 등록
각 프로세스를 [program:별칭] 섹션으로 등록합니다. directory는 명령 실행 전 진입할 작업 디렉터리이며, command에는 가상 환경의 절대 경로를 포함한 실행 구문을 작성합니다.
Python 메인 서비스
[program:main_svc]
command=/home/alex/anaconda3/envs/test_env/bin/python -u main.py
directory=/home/alex/project_root_path
stdout_logfile=supervisor_run_main.log
stderr_logfile=supervisor_run_main.log
Celery 워커 (비트 스케줄러 내장)
[program:celery_beat]
command=/home/alex/anaconda3/envs/test_env/bin/celery -A tasks worker -B
directory=/home/alex/project_root_path
stdout_logfile=supervisor_run_celery.log
stderr_logfile=supervisor_run_celery.log
Spring Boot (Maven)
[program:hk_api]
command=mvn spring-boot:run
directory=/home/alex/pom_xml_location
stdout_logfile=supervisor_run_hkapi.log
stderr_logfile=supervisor_run_hkapi.log
트러블슈팅
print() 출력이 로그에 기록되지 않음
표준 출력 버퍼링으로 인해 실시간 기록이 누락됩니다. Python 인터프리터 호출 시 -u 플래그를 추가하여 버퍼를 비활성화합니다.
command=/home/alex/anaconda3/envs/test_env/bin/python -u main.py
가상 환경 연동 실패
쉘 명령어인 conda activate를 command에 직접 사용하거나, environment 항목으로 PYTHONPATH를 오버라이드하는 시도는 정상 동작하지 않았습니다. 가장 확실한 방법은 실행할 해석기의 전체 경로를 하드코딩하는 것입니다.
핵심 운영 명령
| 명령어 | 설명 |
|---|---|
supervisord | 데몬 시작 |
supervisorctl start <name> | 특정 프로세스 기동 |
supervisorctl restart <name> | 특정 프로세스 재시작 |
supervisorctl stop <name> | 특정 프로세스 중지 |
supervisorctl stop all | 전체 프로세스 중지 |
supervisorctl status | 현재 실행 상태 확인 |
supervisorctl reload | 설정 반영 및 데몬 재구동 |
supervisorctl update | 변경된 설정만 선택적으로 적용 |