## 왜 작업 스케줄러를 포기했는가
많은 개발자들이 Windows 환경에서 Python 스크립트를 주기적으로 실행하기 위해 작업 스케줄러(Task Scheduler)를 사용합니다. 하지만 실제 운영 환경에서는 예상치 못한 문제들이 발생하곤 합니다.
우리 팀도 비슷한 경험을 했습니다. Python 기반 백그라운드 워커를 작업 스케줄러로 관리하다가 다음과 같은 문제들에 직면했습니다:
1. **고아 프로세스 발생** - CLI 도구 실행 중 hang이 발생하면 프로세스가 좀비 상태로 남음
2. **프로세스 추적 불가** - VBS 래퍼나 pythonw.exe를 사용할 경우 실제 프로세스 상태 파악 어려움
3. **자동 복구 기능 부재** - OAuth 토큰 만료, API rate limit 등으로 중단 시 수동 개입 필요
4. **로그 관리의 어려움** - 표준 출력/에러 로그를 별도로 구성해야 함
## PM2: Node.js만을 위한 도구가 아니다
PM2는 주로 Node.js 애플리케이션 관리 도구로 알려져 있지만, 실제로는 **모든 종류의 프로세스**를 관리할 수 있는 범용 프로세스 매니저입니다.
### PM2의 핵심 장점
**1. 직접적인 프로세스 추적**
```javascript
// ecosystem.config.js
module.exports = {
apps: [{
name: 'python-worker',
script: 'python',
args: 'worker.py',
interpreter: 'none', // Python을 직접 실행
autorestart: true,
max_restarts: 100,
min_uptime: '30s',
restart_delay: 5000
}]
}
```
**2. 스마트한 재시작 정책**
- `min_uptime`: 최소 실행 시간 미달 시 비정상 종료로 판단
- `restart_delay`: 재시작 간 대기 시간 (무한 재시작 방지)
- `max_restarts`: 최대 재시작 횟수 제한
**3. 메모리 기반 자동 재시작**
```javascript
max_memory_restart: '2G' // 메모리 2GB 초과 시 자동 재시작
```
**4. 통합 로그 시스템**
```bash
pm2 logs python-worker # 실시간 로그 확인
pm2 logs python-worker --lines 100 # 최근 100줄
```
## 실제 구성 예시
### 1. PM2 설치 (Node.js 필요)
```bash
npm install -g pm2
```
### 2. ecosystem.config.js 작성
```javascript
module.exports = {
apps: [{
name: 'background-worker',
script: 'python',
args: 'worker_v3.py',
interpreter: 'none',
cwd: 'C:\\Projects\\MyWorker',
// 재시작 정책
autorestart: true,
max_restarts: 100,
min_uptime: '30s',
restart_delay: 5000,
// 리소스 관리
max_memory_restart: '2G',
// 환경 변수
env: {
PYTHONUNBUFFERED: '1',
LOG_LEVEL: 'INFO'
},
// 로그 설정
error_file: './logs/err.log',
out_file: './logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z'
}]
}
```
### 3. 실행 및 관리
```bash
# 시작
pm2 start ecosystem.config.js
# 상태 확인
pm2 status
pm2 monit # 실시간 모니터링
# 재시작/중지
pm2 restart background-worker
pm2 stop background-worker
# 부팅 시 자동 시작 설정 (Windows)
pm2 save
pm2 startup
```
## 운영 중 배운 교훈
### 1. min_uptime 설정의 중요성
프로세스가 시작 직후 반복적으로 실패하는 경우를 감지하려면 `min_uptime`을 적절히 설정해야 합니다. 우리는 30초로 설정하여 초기화 실패를 빠르게 감지할 수 있었습니다.
### 2. 환경 변수 FROZEN 패턴
```javascript
env: {
KAFKA_SERVERS: 'broker.example.com:9094' // FROZEN
}
```
주석에 `FROZEN`을 표시하여 변경하면 안 되는 설정을 명시적으로 관리합니다.
### 3. 로그 로테이션
PM2는 기본적으로 로그를 무한히 쌓으므로, `pm2-logrotate` 모듈 설치를 권장합니다:
```bash
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
```
## 결론
Windows 작업 스케줄러는 간단한 스크립트 실행에는 충분하지만, 안정적인 프로덕션 워커 운영에는 한계가 있습니다. PM2를 사용하면:
- ✅ 프로세스 상태를 정확히 추적
- ✅ 장애 시 자동 복구
- ✅ 통합된 로그 관리
- ✅ 메모리 누수 자동 대응
Node.js 환경이 필요하다는 점이 부담스러울 수 있지만, 얻을 수 있는 안정성과 편의성을 고려하면 충분히 투자할 가치가 있습니다.
## 다음 단계
- PM2 클러스터 모드로 다중 워커 관리하기
- PM2 Plus를 활용한 모니터링 대시보드 구축
- Docker 환경에서의 PM2 활용법
development
Windows 환경에서 작업 스케줄러 대신 PM2로 Python 프로세스 관리하기
Task Scheduler의 한계를 극복하고 안정적인 백그라운드 작업 자동화를 구현하는 방법
SpacePlanning · SpacePlanning AI Team2026년 4월 2일조회 292