systemd タイマー(timer)
『systemd timer』は、.timer ユニットファイルを使って定期実行をスケジュールする仕組みです。対応する .service ファイルと組み合わせて使い、タイマーが発火すると自動的にサービスが起動します。journalctl でログを一元管理できる点や、システム起動後の経過時間を基準にした相対スケジュールが書ける点など、従来の cron にはない機能を備えています。
構文
# -----------------------------------------------
# .timer ユニットファイルの基本構造
# -----------------------------------------------
# /etc/systemd/system/{名前}.timer
[Unit]
# タイマーの説明(journalctl のログに表示されます)
Description={タイマーの説明}
# 依存関係:このタイマーが属するターゲット
After=network.target
[Timer]
# -----------------------------------------------
# カレンダー指定(cron に近い書き方)
# -----------------------------------------------
# OnCalendar={カレンダー式}
# → 絶対時刻でスケジュールします(cron の * * * * * に相当)
# 書式: {曜日} {年}-{月}-{日} {時}:{分}:{秒}
# 例: daily → 毎日 00:00:00
# weekly → 毎週月曜 00:00:00
# monthly → 毎月1日 00:00:00
# *-*-* 03:00:00 → 毎日 03:00:00
# Mon *-*-* 09:00 → 毎週月曜 09:00:00
# -----------------------------------------------
# ブート・起動後の相対時間指定
# -----------------------------------------------
# OnBootSec={時間}
# → システム起動後、指定時間が経過したら1回だけ実行します
# 例: 5min → 起動5分後に実行
# OnUnitActiveSec={時間}
# → サービスが最後に起動してから指定時間後に再実行します
# OnBootSec と組み合わせて定期実行を実現します
# -----------------------------------------------
# 精度・ゆらぎ・永続化の設定
# -----------------------------------------------
# AccuracySec={時間}
# → タイマー発火の許容誤差を指定します(デフォルト: 1min)
# → 値を小さくすると精度が上がりますが、省電力効果が下がります
# 例: 1s → 1秒精度
# RandomizedDelaySec={時間}
# → 発火時刻にランダムな遅延を加えます
# → 複数サーバーで同じタイマーを動かすとき、同時実行を避けるのに有効です
# Persistent=true
# → タイマーが停止中(シャットダウン・スリープ中)に
# 実行予定だった処理を、次回起動時に実行します
# → バックアップなど「絶対に1回は動かしたい」処理に使います
[Install]
# タイマーを有効化するターゲット(通常は timers.target)
WantedBy=timers.target
構文一覧
| ディレクティブ | 説明 |
|---|---|
OnCalendar= | 絶対時刻でスケジュールします。daily / weekly などの短縮形や *-*-* 03:00:00 形式で指定できます。cron の時刻指定に最も近い書き方です。 |
OnBootSec= | システム起動後、指定した時間が経過した時点で1回実行します。5min / 30s などの単位で指定します。 |
OnUnitActiveSec= | 対応するサービスが最後に起動してから、指定時間後に再実行します。OnBootSec と組み合わせることで定期的な繰り返しを実現します。 |
OnStartupSec= | systemd マネージャーが起動してから指定時間後に実行します。OnBootSec と似ていますが、ユーザーセッションのタイマーに主に使われます。 |
AccuracySec= | タイマー発火の許容誤差です。デフォルトは 1min。1s にすると秒単位の精度になります。小さいほどCPUウェイクアップが増えるため、省電力との兼ね合いで設定します。 |
RandomizedDelaySec= | 発火時刻にランダムな遅延(0〜指定時間)を加えます。複数台のサーバーで同じスケジュールを動かすとき、処理が一斉に集中するのを防げます。 |
Persistent= | true にすると、システムがオフだった間に実行されるはずだったジョブを次回起動時に補完実行します。バックアップなど「漏らしたくない」処理に有効です。 |
Unit= | このタイマーが起動するユニット名を明示的に指定します。省略した場合、タイマーと同名の .service ファイルが自動的に対象になります。 |
WantedBy=timers.target | [Install] セクションに記述します。systemctl enable でタイマーを有効化するときの登録先ターゲットです。 |
使用例
/etc/systemd/system/shinji-backup.timer
# ----------------------------------------------- # 碇シンジのホームディレクトリを毎日深夜3時にバックアップするタイマー # ----------------------------------------------- [Unit] Description=碇シンジのホームディレクトリ 毎日深夜バックアップタイマー [Timer] # 毎日 03:00:00 に発火します OnCalendar=*-*-* 03:00:00 # 発火時刻の許容誤差を10秒にします(デフォルトの1分より厳密) AccuracySec=10s # システムがシャットダウン中で実行できなかった場合、 # 次回起動時に補完して実行します Persistent=true [Install] WantedBy=timers.target
/etc/systemd/system/shinji-backup.service
# -----------------------------------------------
# タイマーに対応するサービスファイル
# (タイマーファイルと同じ名前にすることで自動的に紐付けられます)
# -----------------------------------------------
[Unit]
Description=碇シンジのホームディレクトリ バックアップ処理
[Service]
Type=oneshot
# バックアップ実行ユーザーを指定します
User=shinji
# /home/shinji を /backup/shinji-{日付}.tar.gz として圧縮保存します
ExecStart=/bin/bash -c 'tar czf /backup/shinji-$(date +%%Y%%m%%d).tar.gz /home/shinji'
# バックアップ先ディレクトリが存在しない場合は作成します
ExecStartPre=/bin/mkdir -p /backup
実行するコマンドは次の通りです。
$ sudo systemctl daemon-reload $ sudo systemctl enable --now shinji-backup.timer Created symlink /etc/systemd/system/timers.target.wants/shinji-backup.timer → /etc/systemd/system/shinji-backup.timer. $ systemctl list-timers shinji-backup.timer NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2026-03-25 03:00:00 JST 18h left - - shinji-backup.timer shinji-backup.service $ journalctl -u shinji-backup.service --since today Mar 25 03:00:00 nerv-server systemd[1]: Starting 碇シンジのホームディレクトリ バックアップ処理... Mar 25 03:00:02 nerv-server systemd[1]: shinji-backup.service: Succeeded. Mar 25 03:00:02 nerv-server systemd[1]: Finished 碇シンジのホームディレクトリ バックアップ処理.
起動後に1回・その後10分おきに実行する(相対時間指定の例)
# ----------------------------------------------- # /etc/systemd/system/rei-sync.timer # 綾波レイのデータ同期タイマー(起動後5分に初回・以降10分おき) # ----------------------------------------------- [Unit] Description=綾波レイのデータ同期タイマー [Timer] # システム起動5分後に最初の同期を実行します OnBootSec=5min # 前回のサービス起動から10分後に次の同期を実行します # OnBootSec と組み合わせることで 5分・15分・25分... と繰り返します OnUnitActiveSec=10min # 複数サーバーで同時に動かす場合に0〜30秒のランダム遅延を加えます RandomizedDelaySec=30s [Install] WantedBy=timers.target
実行するコマンドは次の通りです。
$ sudo systemctl enable --now rei-sync.timer $ systemctl list-timers rei-sync.timer NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2026-03-25 08:52:17 JST 9min left Wed 2026-03-25 08:42:05 JST 41s ago rei-sync.timer rei-sync.service
タイマーの状態確認・停止・削除
# ----------------------------------------------- # タイマーの管理コマンド # ----------------------------------------------- # 登録されているすべてのタイマーの次回実行時刻を確認します systemctl list-timers # 特定タイマーの詳細ステータスを確認します systemctl status shinji-backup.timer # タイマーを一時停止します(自動起動の設定は残ります) sudo systemctl stop shinji-backup.timer # タイマーを再開します sudo systemctl start shinji-backup.timer # タイマーの自動起動を無効にして停止します sudo systemctl disable --now shinji-backup.timer # ユニットファイルを削除した後、systemd の設定を再読み込みします sudo systemctl daemon-reload
実行するコマンドは次の通りです。
$ systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2026-03-25 09:00:00 JST 17min left Wed 2026-03-25 08:00:00 JST 43min ago logrotate.timer logrotate.service Wed 2026-03-25 09:52:00 JST 1h 9min left Wed 2026-03-25 08:48:00 JST 3min ago rei-sync.timer rei-sync.service Thu 2026-03-26 03:00:00 JST 18h left - - shinji-backup.timer shinji-backup.service 3 timers listed.
概要
『systemd timer』は、systemd ユニットファイルの一種である .timer と .service を組み合わせてジョブをスケジュールする仕組みです。crontab と同様に定期実行が可能ですが、systemd timer には次のような利点があります。まず journalctl -u {サービス名} でジョブの実行ログを systemd のログと一元管理できます。次に Persistent=true を設定することで、システムが停止していた間に実行できなかった処理を次回起動時に補完できます。さらに RandomizedDelaySec による分散実行や AccuracySec による精度制御など、cron にはない細かい調整が可能です。一方、cron は多くの環境でデフォルト利用でき、設定が簡潔なため、単純なスケジュール実行には依然として有効な選択肢です。新規に構築するシステムや systemd を中心に管理している環境では timer の採用を検討してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。