우분투 실전 명령어 | systemd timer 반복 작업 운영

서비스 재시작, 로그 정리, 상태 점검 같은 반복 작업을 크론 대신 systemd timer로 운영할 때가 많다. 실패 이력 추적과 단위 파일 관리가 쉬워서 서버 운영에서 특히 유용하다.

언제 쓰는가

  • crontab으로 등록한 작업의 실행 이력을 제대로 추적하고 싶을 때
  • 부팅 후 일정 시간 뒤 실행 같은 조건을 걸고 싶을 때
  • 서비스 단위로 작업을 묶어서 배포와 롤백을 단순화하고 싶을 때

바로 쓰는 명령어

# 1) 실행할 작업 서비스 유닛 생성
sudo tee /etc/systemd/system/cache-clean.service >/dev/null <<'EOF'
[Unit]
Description=Clean app cache

[Service]
Type=oneshot
ExecStart=/usr/bin/find /var/cache/myapp -type f -mtime +7 -delete
EOF

# 2) 타이머 유닛 생성 (매일 03:30 실행)
sudo tee /etc/systemd/system/cache-clean.timer >/dev/null <<'EOF'
[Unit]
Description=Run cache-clean.service daily

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

# 3) 반영 및 활성화
sudo systemctl daemon-reload
sudo systemctl enable --now cache-clean.timer
# 상태/일정 확인
systemctl status cache-clean.timer --no-pager
systemctl list-timers --all | grep cache-clean

# 수동 1회 테스트 실행
sudo systemctl start cache-clean.service
journalctl -u cache-clean.service -n 50 --no-pager

핵심 옵션/패턴

  • OnCalendar: 달력 기반 스케줄. 매일, 매주, 매월 같은 주기를 사람이 읽기 쉬운 형태로 표현한다.
  • Persistent=true: 서버가 꺼져 있던 동안 놓친 실행을 부팅 후 보완 실행한다.
  • RandomizedDelaySec=30m: 동시에 몰리는 작업을 분산할 때 쓴다.
  • AccuracySec=1m: 타이머 정확도 허용 범위를 조정해 시스템 부하를 완화한다.
  • service와 timer를 같은 이름으로 맞추면 운영 중 추적이 쉬워진다.

명령 출력 예시

$ systemctl list-timers --all | grep cache-clean
Wed 2026-02-19 03:30:00 KST 4h left   Tue 2026-02-18 03:30:02 KST 19h ago cache-clean.timer cache-clean.service

$ systemctl status cache-clean.timer --no-pager
● cache-clean.timer - Run cache-clean.service daily
     Loaded: loaded (/etc/systemd/system/cache-clean.timer; enabled; preset: enabled)
     Active: active (waiting) since Tue 2026-02-18 10:12:41 KST; 2h 3min ago
    Trigger: Wed 2026-02-19 03:30:00 KST; 4h left
   Triggers: ● cache-clean.service

자주 하는 실수

  • daemon-reload를 빼먹어서 수정한 유닛 파일이 반영되지 않는 경우
  • timer만 만들고 대응되는 service 파일을 만들지 않아 실행이 실패하는 경우
  • ExecStart 경로를 상대 경로로 적어서 실행 환경마다 깨지는 경우
  • OnCalendar 문법 오타를 내고도 list-timers로 다음 실행 시각을 확인하지 않는 경우

검증 방법

# 문법/설정 확인
systemd-analyze verify /etc/systemd/system/cache-clean.service /etc/systemd/system/cache-clean.timer

# 타이머 활성 상태와 다음 실행 시각 확인
systemctl is-enabled cache-clean.timer
systemctl list-timers cache-clean.timer

# 실제 실행 로그 확인
sudo systemctl start cache-clean.service
journalctl -u cache-clean.service --since '10 minutes ago' --no-pager

운영 팁

  • 운영 스크립트는 /usr/local/bin 아래에 두고 실행 권한을 명확히 관리하면 배포가 편해진다.
  • 실패 알림이 필요하면 서비스 유닛에 OnFailure=를 연결해 알림 유닛으로 넘기면 된다.
  • 기존 crontab에서 옮길 때는 1주일 정도 병행 관찰 후 crontab 항목을 제거하는 편이 안전하다.

출처

  • Ubuntu Documentation
  • systemd 공식 문서
  • Debian Wiki