Linux systemd 타이머 유닛 파일
cron 대신 systemd timer를 사용하여 주기적 작업을 스케줄링하는 유닛 파일 쌍 템플릿입니다. 백업, 정리 작업, 인증서 갱신 등의 예약 실행에 사용합니다.
# ════════════════════════════════════════════════════════════════════
# 파일 1: /etc/systemd/system/db-backup.timer
# 타이머 유닛 — 언제 실행할지 정의
# 적용 방법:
# sudo systemctl daemon-reload
# sudo systemctl enable --now db-backup.timer
# sudo systemctl list-timers --all # 타이머 목록 확인
# ════════════════════════════════════════════════════════════════════
[Unit]
Description=PostgreSQL 데이터베이스 일일 백업 타이머
Documentation=https://wiki.example.com/backup-policy
# 연결된 서비스 유닛 (타이머가 해당 서비스를 트리거)
# 기본적으로 같은 이름의 .service 파일을 찾음 (db-backup.service)
[Timer]
# ──────────────────────────────────────────────────
# OnCalendar: 절대 시간 기반 스케줄 (cron과 유사)
# 형식: 요일 날짜 시:분:초
# ──────────────────────────────────────────────────
# 매일 새벽 2시 30분에 실행
OnCalendar=*-*-* 02:30:00
# 다른 스케줄 예시 (하나만 활성화):
# OnCalendar=Mon *-*-* 03:00:00 # 매주 월요일 오전 3시
# OnCalendar=*-*-1 04:00:00 # 매월 1일 오전 4시
# OnCalendar=Sat,Sun *-*-* 00:00:00 # 주말 자정
# OnCalendar=hourly # 매시 정각
# OnCalendar=daily # 매일 자정 (00:00:00)
# OnCalendar=weekly # 매주 월요일 자정
# OnCalendar=monthly # 매월 1일 자정
# ──────────────────────────────────────────────────
# 랜덤 지연: 스케줄 시간에서 최대 N초 내 임의 지연 실행
# 다수 서버가 동시에 같은 작업을 실행하는 것을 방지 (thundering herd 방지)
# ──────────────────────────────────────────────────
RandomizedDelaySec=300
# ──────────────────────────────────────────────────
# Persistent: true이면 시스템이 꺼져 있던 동안 놓친 실행을
# 부팅 후 즉시 한 번 실행 (cron의 anacron 기능과 유사)
# ──────────────────────────────────────────────────
Persistent=true
# 타이머가 활성화된 후 처음 실행까지 대기 시간 (부팅 후 안정화 대기)
OnBootSec=10min
# 시스템 시계 기준 (realtime: 벽시계, monotonic: 부팅 후 경과)
# OnCalendar 사용 시 자동으로 realtime 적용
# OnActiveSec, OnBootSec 등은 monotonic 기준
# 타이머 정확도 (기본값 1min). 낮출수록 더 정확하지만 절전 방해
AccuracySec=1s
[Install]
WantedBy=timers.target
# ════════════════════════════════════════════════════════════════════
# 파일 2: /etc/systemd/system/db-backup.service
# 서비스 유닛 — 실제 작업 내용 정의 (타이머에 의해 트리거됨)
# 이 파일은 직접 enable하지 않음 (타이머가 관리)
# ════════════════════════════════════════════════════════════════════
[Unit]
Description=PostgreSQL 데이터베이스 일일 백업 실행
# 이 서비스는 타이머에 의해서만 실행되어야 함
After=network-online.target postgresql.service
Requires=postgresql.service
[Service]
Type=oneshot
# oneshot: 작업 완료까지 대기 후 종료 (데몬이 아닌 일회성 작업)
# RemainAfterExit=no 가 기본값이라 완료 후 inactive 상태가 됨
User=postgres
Group=postgres
# 작업 환경 설정
Environment=BACKUP_DIR=/var/backups/postgresql
Environment=RETENTION_DAYS=30
Environment=DB_NAME=myapp_production
Environment=TIMESTAMP_FORMAT=%Y%m%d_%H%M%S
# 백업 전 디렉토리 생성
ExecStartPre=/bin/mkdir -p /var/backups/postgresql
# 메인 백업 실행 스크립트
ExecStart=/usr/local/bin/db-backup.sh
# 백업 후 오래된 파일 정리 (30일 이상)
ExecStartPost=/usr/bin/find /var/backups/postgresql -name "*.dump.gz" -mtime +30 -delete
# 실패 시 관리자에게 이메일 알림 (선택 사항)
OnFailure=notify-admin@failure.service
# 타임아웃: 백업이 2시간 이내에 완료되지 않으면 강제 종료
TimeoutStartSec=2h
# 로그 식별자
SyslogIdentifier=db-backup
# 보안 설정
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/backups/postgresql /tmp
# 리소스 제한: 백업이 시스템 전체를 점유하지 않도록
IOWeight=50
CPUWeight=50
Nice=10
[Install]
# 타이머에 의해 실행되므로 WantedBy 설정 불필요
# 수동 실행: sudo systemctl start db-backup.service