今号では、systemd.timer について、その仕組みや設定方法について説明します!
前回と前々回の記事では cron についてご紹介したので、cron の代替として位置づけられている systemd.timer についても知っておくことで、よりタスク管理を理解できるかと思います。
systemd.timer とは
systemd.timer とは、以前ご紹介した cron のように定期的にタスクを実行してくれる機能の名称です。RHEL9 以降、タスク管理の仕組みとして cron ではなく systemd.timer が標準として搭載されています。
※ cron を使用することもできますが、デフォルトで配置されていたいくつかのジョブは systemd.timer へ移行しています。
cron は crond というデーモンとして動作するのに対し、systemd.timer は systemd が提供する機能のひとつとして動作します。
具体的な機能、設定方法についてはこの後ご説明しますが、systemd.timer は cron と比較して、書式がよりシンプルに変更されていたり、時間指定がより柔軟に設定できるようになっています。
Linux におけるタスク管理とは何か?については、cron の記事で詳しく説明していますので、ぜひご参照ください!
・知っておくとちょっと便利!cron によるタスク管理1
・知っておくとちょっと便利!cron によるタスク管理2
systemd.timer の設定ファイル、ディレクトリ構成
systemd.timer は、基本的に下記 2つのファイルで構成されます。
(※今回は RHEL9 の環境を前提に説明します)
・.timer ファイル:スケジュールを定義します。
・.service ファイル:実行するコマンドやスクリプトを定義します。
.timer ファイルで指定されたスケジュール (日時や間隔) に基づいて、対応する .service ファイルに記載された内容を処理します。
(例えば、A.timer には A.service というファイルが対応します)
これらのファイルは、デフォルトは /usr/lib/systemd/system もしくは /etc/systemd/system 配下に配置されています。
なお、ユーザが独自の .timer や .service を定義したい場合は、通常 /etc/systemd/system 配下に各ファイルを配置します。
ちなみに、ファイルの内容は /usr/lib/systemd/system よりも /etc/systemd/system
の方が優先されるため、既存の .timer や .service の内容に新しい処理を上書きしたい場合も、/usr/lib/systemd/system 配下のファイルを直接編集するのではなく /etc/systemd/system 配下にファイルを配置することを推奨しています。
systemd.timer の設定方法
まずは既存のファイルの内容から、どのような設定ができるのかを見ていきたいと思います。
例として、logrotate.timer の内容を見てみます。
logrotate.timer の内容
[Unit] Description=Daily rotation of log files Documentation=man:logrotate(8) man:logrotate.conf(5) [Timer] OnCalendar=daily AccuracySec=1h Persistent=true [Install] WantedBy=timers.target
- [Unit] セクション
timer ユニットの一般的な情報とドキュメントを定義します。- Description
このユニットの概要です。 - Documentation
このユニットに関連するドキュメント情報です。
- Description
- [Timer] セクション
タスクがいつ、どのように動作するか定義します。- OnCalendar=daily
タスク (この場合ですと、logrotate.service) が実行される頻度を指定します。
daily は毎日実行されることを意味します。
他には hourly(毎時)、weekly(毎週)、特定の日付や時刻なども指定できます。 - AccuracySec=1h
精度を指定します。1h は 1時間を意味します。
これは、タスクが OnCalendar で指定された時刻から最大 1時間の遅延を許容することを示します。
これにより、すべてのタスクが同時に起動してシステムに負荷をかけるのを避けることができます。
他には s(秒)、m(分)、d(日)なども指定できます。 - Persistent=true
この設定が true である場合、システムがシャットダウンしている間に実行されるはずだったタスクが、システム起動後直ちに実行されるようになります。反対に、この設定が false である場合 (もしくは設定されていない場合、デフォルトでは false の動作となる)、スケジュールした時間になってもタスクが実行されなかった場合、そのタイミングでの実行は一度スキップされ、次回の実行タイミングまで待ちます。
- OnCalendar=daily
- [Install] セクション
ユニットが有効化された時の動作を指定します。- WantedBy=timers.target
systemctl enable (システム起動時に、当該のサービスを自動的に有効化する) である場合、どのタイミングで有効化されるかを決めます。
この設定が timers.target である場合、タイマー (定期実行されるタスク) の動作準備が完了したタイミングで、当該のサービスが起動されます。
.timer ファイルを使用している場合は、この設定を使用することが多いです。
他には multi-user.target(サービスの動作準備が完了したタイミング)、graphical.target (GUI 環境が使用可能になったタイミング)、なども指定できます。
- WantedBy=timers.target
systemd.timer に設定可能な項目は、他にもたくさんあります。
より詳しく知りたい方は、man systemd.timer コマンドでマニュアルを確認してみてください。
次号について
次号では、systemd.timer によるタスク管理の tips についてご紹介します!