systemdタイマー(OnCalendar)の書き方 — cronからの変換と検証コマンド

systemdのタイマーはcron式ではなく、OnCalendar= に【曜日 年-月-日 時:分:秒】という独自形式で書きます。cronの置き換えとして主流になりつつあり、読み替えを覚えれば移行は簡単です。

書式の要点(標準cronとの違い)

  • 形式: OnCalendar=曜日 年-月-日 時:分:秒(省略可能な部分が多い)。例: Mon..Fri 09:00 は平日9時。
  • *-*-01 00:00:00 のように*でワイルドカード指定。曜日はMon,Tue…、範囲はMon..Fri。
  • 変換の検証は systemd-analyze calendar "式" コマンド。次回実行時刻を表示してくれます。
  • Persistent=true を付けると、電源オフで飛ばした分を次回起動時に実行します(anacron相当)。
  • タイマー(.timer)と実行内容(.service)の2つのユニットファイルが必要です。

タイムゾーンの扱い

OnCalendarはサーバーのローカルタイムゾーン(通常 /etc/localtime)で解釈されます。日本向けサーバーでTZがAsia/Tokyoなら、日本時間のまま書けます。timedatectlで現在のTZを確認できます。

コピペで使える設定例

cron「0 9 * * 1-5」(平日9時)の置き換え

# /etc/systemd/system/report.timer
[Unit]
Description=weekday report timer

[Timer]
OnCalendar=Mon..Fri 09:00
Persistent=true

[Install]
WantedBy=timers.target

書式の検証(次回実行を確認)

$ systemd-analyze calendar "Mon..Fri 09:00"
$ systemctl enable --now report.timer
$ systemctl list-timers

つまずきポイント

  • cron式(0 9 * * 1-5)をそのままOnCalendarに書いても動きません。必ず読み替えが必要です。
  • 同名の.serviceユニットが無いと動きません(report.timerはreport.serviceを起動する)。
  • 有効化はsystemctl enable --now。enableだけでは次回起動まで動きません。

式を検証する(標準cron形式)

下のツールで式の意味と次回実行時刻を確認できます。サーバーのタイムゾーンに合わせて切り替えられます。

ドロップダウンで組み立てる(クリックだけでcron式を作成)

各項目を選ぶと、上の式が自動で更新されます。「毎」のままの項目は現在の式を維持します。

次に実行される時刻

※ 時刻はお使いの端末のローカルタイムで計算しています。

公式ドキュメント

systemd公式: 時刻書式