systemd - .timer 編

こんにちは、masm11 です。

systemd シリーズの第5回、最終回です。

f:id:masm11:20201202230535p:plain

初回:

前回:

今回は .timer ファイルについて説明します。

.timer ファイルとは

以前から Linux/UNIX を管理している方には、cron の代わり、と言うと 話が早いかと思います。前回比較した inetd よりご存知の方は多いのでは ないかと思います。

この unit ファイル中に指定されている日時に、指定されているサービスを 起動するのです。

.timer ファイルの書き方

[Unit] セクション

.timer ファイルも unit ファイルの一種なので、[Unit] セクションが あります。

[Unit]
Description=ZFS replication timer

こんな感じで良いかと思います。.service の場合と同様、Description は ログ出力の際などに使われます。

[Timer] セクション

.timer ファイル特有のセクションです。

OnCalendar=hourly

これで、1時間おき (毎正時) に service を起動してくれます。 hourly の他に daily や weekly なども指定できます。

でも、毎正時っていろんな処理が起動して負荷が高くなりがちですよね。 そういう時にはこれです。

AccuracySec=300

指定するのは秒数です。OnCalendar で指定した時刻から、ランダムで AccuracySec までずらしてくれます。

Persistent=true

これを true にしておくと、前回 service を起動した日時をディスクに 保存しておいて、次に timer が start した際 (OS 起動時とか) に 「1回飛ばしてる!」と思ったら、その瞬間、service を起動してくれます。

Unit=foo.service

これは起動する service 名を指定します。 指定しなかった場合は、foo.timer のデフォルトは foo.service に なりますので、大抵の場合は指定しなくて良いと思います。

[Install] セクション

このセクションを書いておくと、systemctl enable できるようになります。

[Install]
WantedBy=timers.target

こう書いておくことが多いと思います。

.timer ファイルの書き方

そして、起動するサービスも定義しておく必要があります。 サービスですので .service ファイルに書きます。

[Unit]
Description=ZFS replication service
After=network.target
Requires=network.target

[Service]
Type=oneshot
ExecStart=/etc/systemd/zfs/zfsendsnap.rb zroot/home

ExecStart にサービスのプログラムを指定します。

[Install] セクションは不要です。

あとは、

sudo systemctl start foo.timer

とするだけで、指定日時になると service が起動します。

デバッグ

service を開発中で、timer 経由でなく service を直接起動したい場合もあるでしょう。

その場合は、

systemctl start foo.service

で起動することができます。

まとめ

今回は .timer ファイルの内容について説明しました。

ここまでの5回で、

  • systemctl の使い方
  • .service の書き方
  • unit ファイルの編集方法
  • .socket の書き方
  • .timer の書き方

について、具体例として私がよく使う使い方を交えながら説明してきました。 今回でこのシリーズは終わりです。

systemd はなんとも大きなシステムでとっつきにくいですが、 このくらいでも書けると、だいぶん systemd の世界に親しみを感じるようになります。

少しでも参考にしていただけたら幸いです。

では良いお年を!