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形式)
下のツールで式の意味と次回実行時刻を確認できます。サーバーのタイムゾーンに合わせて切り替えられます。
次に実行される時刻
※ 時刻はお使いの端末のローカルタイムで計算しています。