systemdでcronのようなスケジュールを設定する場合timerユニットを書きますが、これがcronの書式とは全然違うのでなかなか慣れないかと思います。
timerユニットの書き方(OnCalendarの場合)
たとえばこんな感じですね。
[Unit]
Description=Run foo weekly
[Timer]
OnCalendar=Sat *-*-1..7 18:00:00
Persistent=true
[Install]
WantedBy=timers.target
このOnCalendar
のところの書式がcronとは違います。
# 毎週(月曜日の0時)実行
OnCalendar=weekly
# 毎月の1日から4日まで、月曜日か火曜日の場合にのみ、12時に実行
OnCalendar=Mon,Tue *-*-01..04 12:00:00
# 毎週第1土曜日の18時に実行
OnCalendar=Sat *-*-1..7 18:00:00
# 毎日4時に実行
OnCalendar=*-*-* 4:00:00
ちなみにOnCalendar
は複数指定できます。
# 平日の22:30と土日の20:00
OnCalendar=Mon..Fri 22:30
OnCalendar=Sat,Sun 20:00
この書式が具体的に何時に動くのか確認する
よほど慣れているならともかく、ぱっと見ていつ実行されるのかいまいち確信が持てなかったりしませんか?
業務で運用しているシステムに設定するときなんて「本当にこれで合ってるのか?」ってめちゃくちゃ不安になりますよね!
そこでsystemd-analyze
の登場です。
こいつはいろいろなサブコマンドを持っているのですが、これのsystemd-analyze calendar
を使うと、OnCalendar
に指定する書式が実際にいつ実行されるかというスケジュールを確認することができます。
$ systemd-analyze calendar --iterations=5 '*-*-* 00/12:00/30:00'
Normalized form: *-*-* 00/12:00/30:00
Next elapse: Thu 2021-09-30 00:00:00 JST
(in UTC): Wed 2021-09-29 15:00:00 UTC
From now: 9h left
Iter. #2: Thu 2021-09-30 00:30:00 JST
(in UTC): Wed 2021-09-29 15:30:00 UTC
From now: 9h left
Iter. #3: Thu 2021-09-30 12:00:00 JST
(in UTC): Thu 2021-09-30 03:00:00 UTC
From now: 21h left
Iter. #4: Thu 2021-09-30 12:30:00 JST
(in UTC): Thu 2021-09-30 03:30:00 UTC
From now: 21h left
Iter. #5: Fri 2021-10-01 00:00:00 JST
(in UTC): Thu 2021-09-30 15:00:00 UTC
From now: 1 day 9h left
試しに実行してみるとこんな感じになりました。
*-*-* 00/12:00/30:00
は毎日00:00、00:30、12:00、12:30に実行という指定です。見るからにややこしい指定ですが、具体的にいつ実行されるかがずらっと表示されました。わかりやすいですね!
使える環境
systemd-analyze
コマンド自体はだいたいの環境にあると思うのですが、calendar
サブコマンドが追加されたのはsystemd 236
からのようです。
加えて、上記の例のように指定の周期分出力する--iterations
オプションが追加されたのはsystemd 242
からのようです。
ちょっと古めのOSだと使えない可能性がありますね。
まぁ、確認するだけならどこかで新しいOSを動かしてコマンド叩けばいいですね。
-
calendar
サブコマンドはsystemd 236
から -
--iterations
オプションはsystemd 242
から
参考までによくあるOSとバージョンです。
OS | systemdのバージョン |
---|---|
CentOS 7 | systemd 219 |
CentOS 8 | systemd 239 |
CentOS 8 Stream | systemd 239 |
Ubuntu 18.04 LTS (Bionic Beaver) | systemd 237 |
Ubuntu 20.04 LTS (Focal Fossa) | systemd 245 |