それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

systemd タイマーの書き方。OnCalendarのtimer 設定の記述方法とチェック方法をおさらいする。cronの代替にするサンプル集

systemd の timer サービスの書き方で時間の指定が困る。

cron で日付や時間の指定をようやく覚えて自由自在に作ってたのに、systemd timer だと onCalendar です。crontabから覚え直しです。

cron書式と違うんですよね。onCalendarは独自です。

systemd.timer の例

OnCalendarは次のように timer ファイル使いますよね。

[Unit]
Description=Splattoon splatnet2ink timer

[Timer]
OnCalendar= hourly
RandomizedDelaySec=10
Unit = splatnet2statink.service

[Install]
WantedBy=default.target

関連記事 →  splatnet2statinkで stat.inkへアップロードをsystemd で自動化する。 - それマグで!

OnCalendar の書式

書式は次のようになっています。

OnCalendar=$DAY_OF_WEEK $YEAR-$MONTH-$DAY $Hour:$Minute:$Second

ただし、省略可能だったりするので、世間にはいっぱい書式が溢れている。

全部詳細なのは、公式ドキュメントを読んだほうが良いと思う

記述例

書式例のサンプルとか、作成方法を見たほうが早い

よく使いそうなもの

サンプル
毎週月曜 mon
毎週月水金 mon,fri,wed
毎日18時 18:00
毎木 15時 Thu 15:00

フルで書いた書式

サンプル
毎週月曜 Mon *-*-* 00:00:00
毎週月水金 Mon,Wed,Fri *-*-* 00:00:00
毎日18時 *-*-* 18:00:00
毎木 15時 Thu *-*-* 15:00:00

省略形のほうが読みやすいし、一瞥して理解しやすい。ただし、記述が面倒な感じありますね。

月末はちょっと特殊

特殊記号 チルダ ~ を使って月末から何日か計算する

サンプル
月最終日 *-*~1 18:*
月末2日前 *-*~2 18:*
5月最終火曜 Tue *-*~07
最終月曜日 mon *-*~07/1

最終曜日、これは最終日から -7を取得して、曜日 絞り込んでる、これで最終月曜日などを計算する。ハイフンは使えないので、代わりにチルダって覚えると良いです。

毎月の最終金曜日とか業務に使えそうですよねー

ただし、毎月25日だとか26日だとかは、祝日の計算が入ってくるので、細かいところはプログラムでやるしか無いですよね。

定期的書式

省略形の 定期系書式

onCalendar 同等のフル書式 日本語での意味
minutely *-*-* *:*:00 毎分
hourly *-*-* *:00:00 毎時
daily *-*-* 00:00:00 日次
monthly *-*-01 00:00:00 月次
weekly Mon *-*-* 00:00:00 週次
yearly *-01-01 00:00:00 年次
quarterly *-01,04,07,10-01 00:00:00 四半期ごと
semiannually *-01,07-01 00:00:00 半期ごと

書式を調べる方法 systemd-analyze calendar

省略形や、サンプルで書式をアレコレと試行錯誤するために、テストツールがあります。

このコマンドで書式が正しいか調べることができます。

systemd-analyze calendar 'Thu 15:00'

systemd でタイマーを作って、書式がおかしいとエラーになったときに役に立つコマンドです。

たとえば、次のようなうろ覚えの省略形を試すと、解析されて結果が取れます。

誤ったOnCalendar記述の例

エラーになることがわかります。どうすれば良いのかの提案はありません。

takuya@:~$ systemd-analyze calendar 'Thu 15'
Failed to parse calendar specification 'Thu 15': 無効な引数です

正しい記述の例

正しく記述できると、フル書式ではどう書くのか、また、次に実行される時刻を押してくれます。

takuya@:~$ systemd-analyze calendar 'Thu 15:00'
  Original form: Thu 15:00
Normalized form: Thu *-*-* 15:00:00
    Next elapse: Thu 2020-04-30 15:00:00 JST
       (in UTC): Thu 2020-04-30 06:00:00 UTC
       From now: 6 days left

日付のチェックが出来るところがとても有能だと思います。crontab / cron だと日付のチェックが面倒だし。

まとめ

OnCalendar は DOW Y-M-D H:i:S でかく。
OnCalendar は systemd-analyze calendar で省略形の書式試す。

関連記事

systemd の タイマーは enable してもstart をしないと動かない - それマグで!
splatnet2statinkで stat.inkへアップロードをsystemd で自動化する。 - それマグで!

参考資料

https://wiki.archlinux.org/index.php/Systemd/Timers

systemd.time