今号では、systemd.timer で設定可能なパラメータや、実現可能な設定方法について、もう少し深堀りして説明します!
独自の timer (タイマー)を設定する
前回の記事では、デフォルトで使用されている .timer の内容から、どのような設定があるのかを確認しました。
今回は、実際に systemd.timer の設定を自分で追加する手順を説明します。
例として、一定の間隔でログに文字を出力するスクリプトを呼び出すタスクを設定してみます。
.service および .timer ファイルを作成する
下記の様な service および timer ファイルを作成します。
/etc/systemd/system/test.service
[Unit] Description=test script [Service] Type=oneshot ExecStart=/work/test.sh
- Description=test script
このサービスファイルの概要 - Type=oneshot
サービスが 1回だけ実行されることを示す (実行タイミングが来るごとに 1回) - ExecStart=/work/test.sh
実行するコマンドを指定
/etc/systemd/system/test.timer
[Unit] Description=Run test script [Timer] OnCalendar=minutely [Install] WantedBy=timers.target
- Description
このタイマーファイルの概要 - OnCalendar=minutely
タスク (test.service) が実行される頻度
minutely は毎分を表す - WantedBy=timers.target
サービスがどのタイミングで有効化されるか
なお、test.service に記載のある /work/test.sh ファイルの内容は下記の通りとなっています。
/work/test.sh
#!/bin/bash echo "$(date) testlog" >> /work/test.log
タイマーを起動
service ファイルと timer ファイルを追加したため、daemon-reload を実行した後に systemctl で test.timer を起動します。
# systemctl daemon-reload # systemctl start test.timer
なお、起動に成功しタイマーが設定されると、下記のコマンドで現在エントリされているタイマーの一覧を確認することができます。
# systemctl list-timers
結果を確認
タイマーの設定どおりにタスクが実行されているか、実際のログから確認してみます。
# cat /work/test.log Fri Aug 1 12:46:04 AM UTC 2025 testlog Fri Aug 1 12:47:04 AM UTC 2025 testlog Fri Aug 1 12:48:04 AM UTC 2025 testlog Fri Aug 1 12:49:04 AM UTC 2025 testlog #
ちゃんと毎分(1分ごとに)ログが書き込まれていることが確認できました。
タスクの実行頻度を設定するための tips
timer ファイルの [timer] 項で設定できるディレクティブの一部を紹介します。
- OnCalendar
最も一般的な設定方法で、特定の日時、定期的なタイミング (毎日、毎分など) を指定します。
■ 例1:OnCalendar=daily (毎日)
■ 例2:OnCalendar=Sat,Sun 09:00 (毎週土日の午前 9時)
■ 例3:OnCalendar=*-*-* 09:00:00 (毎日午前 9時)
なお、例3 のように特定の時刻は YYYY-MM-DD HH:MM:SS 形式で指定できます。
* はすべての時刻を表します。 - OnActiveSec
タイマーが有効化されてからの時間を指定します。
具体的には、対象の .timer ユニットが active になってからの時間になります。
■ 例:OnActiveSec=15min (タイマーが有効化されてから 15分後) - OnBootSec
システムが起動してからの秒数を指定します。
具体的には、systemd が boot.target に到達してからの時間になります。
■ 例:OnBootSec=15min (システムが起動されてから 15分後)
なお、systemd では時間に関するディレクティブで下記の単位を使用できるようになっています。
OnActiveSec や OnBootSec、その他のディレクティブにも下記の単位が使用できます。
- s, sec, second (秒)
- min, minute (分)
- h, hr, hour (時間)
- d, day (日)
- w, week (週)
- m, month (月)
- y, year (年)
また、今回紹介しきれなかったディレクティブが他にもいくつかありますので、詳しい内容を知りたい方は man systemd.timer にて systemd.timer のマニュアルを確認してみてください。