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 で自動化する。 - それマグで!