홈/엔지니어/OS / 시스템/systemd timer — cron 대체 스케줄러…
OS / 시스템중급UbuntuDebianCentOSsystemdtimercron

systemd timer — cron 대체 스케줄러

systemd timer 유닛으로 정기 작업을 예약하고, 실패 알림·로그·지연 실행을 설정하는 방법과 cron 대비 장단점을 설명합니다.

목차
  1. systemd timer vs cron
  2. 기본 구조 — .service + .timer 쌍
  3. 예시: 매일 백업
  4. OnCalendar 표현식
  5. 부팅 후 일정 시간 뒤 실행
  6. 실패 알림 설정
  7. 로그 및 수동 실행

systemd timer vs cron

항목cronsystemd timer
로그syslog 혼재journalctl 통합
실패 감지어려움자동 (OnFailure=)
의존성없음After=, Requires=
누락 실행 보정없음Persistent=true
실행 환경제한적서비스 유닛과 동일

기본 구조 — .service + .timer 쌍

Bash
# 두 파일이 쌍을 이룸
/etc/systemd/system/mybackup.service   # 실행할 작업
/etc/systemd/system/mybackup.timer     # 실행 스케줄

예시: 매일 백업

INI
# /etc/systemd/system/mybackup.service
[Unit]
Description=Daily database backup
After=network.target postgresql.service

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup.sh
StandardOutput=journal
StandardError=journal
INI
# /etc/systemd/system/mybackup.timer
[Unit]
Description=Run mybackup daily at 3am

[Timer]
OnCalendar=*-*-* 03:00:00     # 매일 03:00
Persistent=true                # 누락된 실행 즉시 보정
RandomizedDelaySec=300         # 최대 5분 랜덤 지연 (서버 분산)
Unit=mybackup.service          # 생략 가능 (같은 이름 자동 연결)

[Install]
WantedBy=timers.target
Bash
# 활성화 및 시작
sudo systemctl daemon-reload
sudo systemctl enable --now mybackup.timer

# 상태 확인
systemctl status mybackup.timer
systemctl list-timers

OnCalendar 표현식

CODE
*-*-* 00:00:00       # 매일 자정
*-*-* 03:00:00       # 매일 03:00
Mon *-*-* 09:00:00   # 매주 월요일 09:00
*-*-1 00:00:00       # 매월 1일 자정
*-*-* 0/6:00:00      # 6시간마다
hourly               # 매시 정각 (= *-*-* *:00:00)
daily                # 매일 자정 (= *-*-* 00:00:00)
weekly               # 매주 월요일 자정
monthly              # 매월 1일 자정
Bash
# 표현식 검증
systemd-analyze calendar "*-*-* 03:00:00"
systemd-analyze calendar "Mon *-*-* 09:00:00"

부팅 후 일정 시간 뒤 실행

INI
[Timer]
OnBootSec=5min         # 부팅 5분 후 1회 실행
OnUnitActiveSec=1h     # 이후 1시간마다 반복

실패 알림 설정

INI
# mybackup.service에 추가
[Unit]
OnFailure=notify-failure@%n.service

# /etc/systemd/system/notify-failure@.service
[Unit]
Description=Failure notification for %i

[Service]
Type=oneshot
ExecStart=/usr/local/bin/notify-slack.sh "Timer %i failed"

로그 및 수동 실행

Bash
# 타이머 전체 목록 (다음 실행 시간 포함)
systemctl list-timers --all

# 서비스 로그
journalctl -u mybackup.service --since today
journalctl -u mybackup.service -n 50

# 수동으로 즉시 실행 (타이머와 별개)
sudo systemctl start mybackup.service

# 타이머만 중지 (서비스는 유지)
sudo systemctl stop mybackup.timer
sudo systemctl disable mybackup.timer
#systemd#timer#cron#스케줄러#자동화#linux
편집 안내 · Editorial Note

AI 도구가 초안 작성에 사용될 수 있습니다. 명령어의 실행 여부와 검증 환경은 각 가이드에 기재된 근거를 확인하세요. 적용 전 사용 중인 버전의 공식 문서를 확인하고, 오류는 이메일로 알려주세요. 이메일로 제보

주제 관련 공식 문서(자동 연결 · 문장별 근거 아님)GNU/Linux man 페이지 ↗

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.