systemd timer
cron은 수십 년을 버텨온 검증된 도구입니다. 하지만 현대 리눅스 시스템에서는 systemd가 init 시스템으로 자리를 잡으면서, 타이머 기능도 함께 제공합니다.
systemd timer는 cron보다 더 정교하고, 로그 관리가 체계적이며, 실패했을 때 재시도 설정도 할 수 있습니다. Ubuntu 24.04에서 이미 /etc/systemd/system/ 아래에 여러 타이머가 동작 중입니다.
systemd timer 구조
systemd timer는 두 개의 파일로 이루어집니다.
.service파일: 실제로 실행할 내용을 정의합니다..timer파일: 언제 실행할지 일정을 정의합니다.
두 파일의 이름은 같아야 합니다. myjob.service와 myjob.timer처럼요.
.service 파일 작성
서비스 파일은 실행할 스크립트를 지정합니다.
# 파일: /etc/systemd/system/sysstat-logger.service[Unit]Description=시스템 상태 기록After=network.target[Service]Type=oneshotUser=ubuntuExecStart=/home/ubuntu/scripts/sysstat.shStandardOutput=journalStandardError=journal
주요 옵션을 살펴봅시다.
Type=oneshot: 명령 실행 후 바로 종료되는 일회성 서비스입니다. 타이머와 함께 쓸 때는 보통 이 타입을 씁니다.User=ubuntu: 이 사용자 권한으로 실행합니다.ExecStart: 실행할 명령입니다.StandardOutput=journal: 출력을 journald에 저장합니다.
.timer 파일 작성
타이머 파일은 실행 시각을 지정합니다.
# 파일: /etc/systemd/system/sysstat-logger.timer[Unit]Description=5분마다 시스템 상태 기록[Timer]OnCalendar=*:0/5AccuracySec=1minPersistent=true[Install]WantedBy=timers.target
OnCalendar 형식. systemd timer는 cron과 다른 시간 형식을 씁니다.
| OnCalendar 값 | 의미 |
|---|---|
*:0/5 |
매 5분마다 |
hourly |
매시 정각 |
daily |
매일 자정 |
weekly |
매주 월요일 자정 |
monthly |
매월 1일 자정 |
*-*-* 03:00:00 |
매일 오전 3시 |
Mon *-*-* 09:00:00 |
매주 월요일 오전 9시 |
*-*-1 00:00:00 |
매월 1일 자정 |
OnBootSec. 부팅 후 지정된 시간이 지나면 실행합니다.
[Timer]OnBootSec=10min # 부팅 후 10분 뒤 첫 실행OnUnitActiveSec=1h # 이후 1시간마다 반복
Persistent=true. 타이머가 꺼져 있는 동안 실행되었어야 할 작업을 시스템이 켜지면 바로 한 번 실행합니다. 새벽 3시에 백업해야 하는데 그 시간에 서버가 꺼져 있었다면, 켜지자마자 한 번 실행해주는 기능입니다.
활성화와 시작
# systemd 설정 파일 다시 읽기sudo systemctl daemon-reload# 타이머 활성화 (부팅 시 자동 시작)sudo systemctl enable sysstat-logger.timer# 타이머 즉시 시작sudo systemctl start sysstat-logger.timer# 타이머 상태 확인sudo systemctl status sysstat-logger.timer# 서비스 수동 실행 (테스트)sudo systemctl start sysstat-logger.service
로그 확인
systemd timer의 가장 큰 장점 중 하나는 로그 관리입니다. journalctl로 실행 이력과 출력을 바로 확인할 수 있습니다.
# 특정 서비스 로그 확인journalctl -u sysstat-logger.service# 최근 10줄만 확인journalctl -u sysstat-logger.service -n 10# 실시간 로그 추적journalctl -u sysstat-logger.service -f# 오늘 실행된 로그만 확인journalctl -u sysstat-logger.service --since today
cron vs systemd timer 비교
| 항목 | cron | systemd timer |
|---|---|---|
| 설정 방식 | 단일 파일 | .service + .timer 두 파일 |
| 로그 관리 | 직접 리다이렉션 | journald 자동 수집 |
| 실패 재시도 | 없음 | 설정 가능 |
| 의존성 설정 | 없음 | After=, Requires= 가능 |
| 부팅 후 실행 누락 처리 | 없음 | Persistent=true |
| 사용 난이도 | 쉬움 | 보통 |
| 시스템 통합 | 낮음 | 높음 |
실습: 간단한 systemd timer 설정
매 5분마다 /tmp/timer_test.log에 타임스탬프를 기록하는 타이머를 만들어봅시다.
서비스 파일을 먼저 만듭니다.
sudo nano /etc/systemd/system/timer-test.service
# 파일: /etc/systemd/system/timer-test.service[Unit]Description=타이머 테스트 서비스[Service]Type=oneshotExecStart=/bin/bash -c 'echo "$(date) - 타이머 실행됨" >> /tmp/timer_test.log'
타이머 파일을 만듭니다.
sudo nano /etc/systemd/system/timer-test.timer
# 파일: /etc/systemd/system/timer-test.timer[Unit]Description=5분마다 실행하는 테스트 타이머[Timer]OnCalendar=*:0/5AccuracySec=10sec[Install]WantedBy=timers.target
활성화하고 시작합니다.
sudo systemctl daemon-reloadsudo systemctl enable timer-test.timersudo systemctl start timer-test.timer
상태를 확인합니다.
sudo systemctl status timer-test.timer
출력 예시입니다.
● timer-test.timer - 5분마다 실행하는 테스트 타이머
Loaded: loaded (/etc/systemd/system/timer-test.timer; enabled)
Active: active (waiting) since Mon 2026-04-24 09:10:01 KST; 2min ago
Trigger: Mon 2026-04-24 09:15:00 KST; 2min 30s left
5분을 기다리거나 서비스를 직접 실행해서 확인합니다.
# 수동 실행으로 테스트sudo systemctl start timer-test.service# 로그 확인cat /tmp/timer_test.log
결과입니다.
Mon Apr 24 09:12:34 KST 2026 - 타이머 실행됨
Mon Apr 24 09:15:01 KST 2026 - 타이머 실행됨
테스트가 끝나면 정리합니다.
sudo systemctl stop timer-test.timersudo systemctl disable timer-test.timersudo rm /etc/systemd/system/timer-test.*sudo systemctl daemon-reload