自由気ままに書いちゃおう

好きなことをつらつらと・・・

【RHEL8】systemdのTimerユニットについて

スケジュール実行にはCron(anacron)によるもの以外にも、
systemdのTimerユニットを使う方法があります。
本記事では、Timerユニットについて記載しております。

本記事は以下の本を参考にしております。

■Timerユニットとは?

・Cronの代わりにスケジュール実行ができます。

・スケジュール実行には2種類あります。
 ① モノトニックタイマー・・・開始点を動的なものにしたいときに利用
 ② リアルタイムタイマー・・・カレンダー形式(=Cron同様)を利用したいときに利用

■Timerユニットによるスケジュール一覧

まずは、デフォルトでどのようなTimerが設定されているかを確認してみます。

systemctl list-timers --all --full

f:id:guri2o1667:20210107093024p:plain

内容はともかく、3つ登録されていることが確認できました。

■スケジュール一覧の各カラムについて

systemctl list-timers --all で出力された結果には、以下の列名があります。
① NEXT
⇒ タイマーの次回実行時刻です。

② LEFT
⇒ 次回実行時刻(=NEXT)が実行されるまでの残り時間です。

③ LAST
⇒ 直近で実行されたタイマーの時刻です。

④ PASSED
⇒ 直近で実行されたタイマー時刻からの経過時間です。

⑤ UNIT
⇒ タイマーのUnit名です。

⑥ ACTIVATES
⇒ タイマー実行時に有効になる(=実行される)サービス名です。

■TimerユニットとServiceユニットの原則1

XXXX.timerとXXXX.serviceは対になっており、
どちらのファイルも必要、かつXXXX部分の名称は基本的に揃えます。
※揃えた方が管理面で楽です。

具体的例ですが、上記一覧の3つ目に記載の項目は、
systemd-tmpfiles-clean.serviceとsystemd-tmpfiles-clean.timerとなっており、拡張子前の名称(systemd-tmpfiles-clean部分)は同一です。

こういうものだと思っておいてもらえればと。

■TimerユニットとServiceユニットの原則2

.timerは、.serviceを起動もしくは制御します。
そのため、.serviceには[Install]セクションが存在しません。
※通常の.serviceには[Install]セクションが必須です。例えばNetworkManagerサービスは以下のような設定になっています。

f:id:guri2o1667:20210107095251p:plain

■TimerユニットとServiceユニットの原則3

.timerを使うには、有効化(systemctl enable)および起動(systemctl start)が必要です。
※通常の.serviceと同じです。

■具体例を見てみる(systemd-tmpfiles-clean.service)

systemd-tmpfiles-clean.service(=一覧に表示されたうちの3つ目)について確認してみます。
※3つ目を選んだ理由は説明しやすかっただけです。。。


UNIT列とACTIVATES列に記載の .timer , .serviceの詳細は以下の通りです。
① /usr/lib/systemd/system/systemd-tmpfiles-clean.timer

f:id:guri2o1667:20210107094143p:plain

大事なのは15行目以降です。[Timer]セクションで起動条件を記載します。
16行目で「起動15分後に実行」を定義しています。
17行目で「実行周期(ここでは1日)」を定義しています。
※ちなみに、この設定は「モノトニックタイマー」です。

② /usr/lib/systemd/system/systemd-tmpfiles-clean.service

f:id:guri2o1667:20210107094332p:plain

上記①のsystemd-tmpfiles-clean.timerが起動した際に実行されるサービスです。
設定内容は普通の.serviceユニットと基本的には同じですが、前述したように[Install]セクションはありません。

纏めると、
「.timerで実行タイミングを定義し、定義したタイミングで.serviceが起動する」
と言えます。

■補足: Timerユニットで利用できる設定値のmanページ

man 7 systemd.time



以上です。

本記事は以下の本を参考にしております。