iBetter Books
수정

systemd timer

cron은 수십 년을 버텨온 검증된 도구입니다. 하지만 현대 리눅스 시스템에서는 systemd가 init 시스템으로 자리를 잡으면서, 타이머 기능도 함께 제공합니다.

systemd timer는 cron보다 더 정교하고, 로그 관리가 체계적이며, 실패했을 때 재시도 설정도 할 수 있습니다. Ubuntu 24.04에서 이미 /etc/systemd/system/ 아래에 여러 타이머가 동작 중입니다.

systemd timer 구조

systemd timer는 두 개의 파일로 이루어집니다.

  • .service 파일: 실제로 실행할 내용을 정의합니다.
  • .timer 파일: 언제 실행할지 일정을 정의합니다.

두 파일의 이름은 같아야 합니다. myjob.servicemyjob.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