#1 はじめに
以下の2通りの方法でタイマの動作確認をしてみます。
・systemd-runコマンド
・タイマユニットファイル、サービスユニットファイル
#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
#3 systemd-runコマンドを使う方法
##3.1 モノトニックタイマの使い方
###3.1.1 1回だけ実行する場合
systemd-runの実行結果を確認するため、journalctlコマンドを実行します。
[root@server ~]# journalctl -f
ターミナルをもう1つオープンします。
タイマを起動してから5秒後にloggerコマンドを1回だけ実行してみます。
タイマの精度は100msに設定しました。タイマの精度を指定しないと、精度は1分になるようです。
[root@server ~]# systemd-run --on-active=5 --timer-property=AccuracySec=100ms /usr/bin/logger TEST
Running timer as unit: run-r82de50047a7848959a1307f06cfd6244.timer
Will run service as unit: run-r82de50047a7848959a1307f06cfd6244.service
タイマを起動してから5秒後にTEST
が出力されていることがわかります。
[root@server ~]# journalctl -f
3月 03 22:20:35 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:20:40 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:20:40 server root[123185]: TEST
3月 03 22:20:40 server systemd[1]: run-r82de50047a7848959a1307f06cfd6244.service: Succeeded.
3月 03 22:20:40 server systemd[1]: run-r82de50047a7848959a1307f06cfd6244.timer: Succeeded.
###3.1.2 定期的に実行する場合
タイマを起動してから5秒後にloggerコマンドを実行し、その後、
2秒間隔でloggerコマンドを実行してみます。
[root@server ~]# systemd-run --on-active=5 --on-unit-active=2 --timer-property=AccuracySec=100ms /usr/bin/logger TEST
タイマを起動してから5秒後にTEST
が出力され、その後、
2秒間隔でTEST
が出力されていることがわかります。
[root@server ~]# journalctl -f
3月 03 22:21:57 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:22:02 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:22:02 server root[123195]: TEST
3月 03 22:22:02 server systemd[1]: run-rd31c925c098042a69aa6b5cb75484101.service: Succeeded.
3月 03 22:22:04 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:22:04 server root[123202]: TEST
3月 03 22:22:04 server systemd[1]: run-rd31c925c098042a69aa6b5cb75484101.service: Succeeded.
3月 03 22:22:06 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:22:06 server root[123204]: TEST
3月 03 22:22:06 server systemd[1]: run-rd31c925c098042a69aa6b5cb75484101.service: Succeeded.
3月 03 22:22:08 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:22:08 server root[123206]: TEST
3月 03 22:22:08 server systemd[1]: run-rd31c925c098042a69aa6b5cb75484101.service: Succeeded.
3月 03 22:22:10 server systemd[1]: run-rd31c925c098042a69aa6b5cb75484101.timer: Succeeded.
3月 03 22:22:10 server systemd[1]: Stopped /usr/bin/logger TEST.
タイマを停止します。
[root@server ~]# systemctl stop run-rd31c925c098042a69aa6b5cb75484101.timer
##3.2 カレンダータイマの使い方
###3.2.1 タイマを毎分起動する方法
7時1分、7時2分というように、毎分タイマを起動してみます。
タイマの精度(AccuracySec)は1分にしてみました。
なお、--on-calendar
の書式は、年-月-日 時:分:秒
です。
[root@server ~]# systemd-run --on-calendar='*-*-* *:*:00' --timer-property=AccuracySec=1s logger TEST
22時33分,22時34分,22時35分というように、毎分タイマが起動され、loggerコマンドが
実行されていることがわかります。
[root@server ~]# journalctl -f
3月 03 22:32:16 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:33:00 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:33:00 server root[123452]: TEST
3月 03 22:33:00 server systemd[1]: run-r9d13b8ecb9b54d6f80717b8a52ace8be.service: Succeeded.
3月 03 22:34:00 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:34:00 server root[123462]: TEST
3月 03 22:34:00 server systemd[1]: run-r9d13b8ecb9b54d6f80717b8a52ace8be.service: Succeeded.
3月 03 22:35:00 server systemd[1]: Started /usr/bin/logger TEST.
3月 03 22:35:00 server root[123470]: TEST
3月 03 22:35:00 server systemd[1]: run-r9d13b8ecb9b54d6f80717b8a52ace8be.service: Succeeded.
タイマを停止します。
[root@server ~]# systemctl stop run-r854d2350edc84d9b90dcac664ebd723e.timer
###3.2.2 タイマを指定した秒で起動する方法
タイマを毎分の0秒,15秒,30秒,45秒で起動してみます。
[root@server ~]# systemd-run --on-calendar='*-*-* *:*:0,15,30,45' --timer-property=AccuracySec=1s logger -p crit TEST
[root@server ~]# journalctl -f -p crit
-- Logs begin at Wed 2021-03-03 20:22:13 JST. --
3月 03 22:42:30 server root[123641]: TEST
3月 03 22:42:45 server root[123644]: TEST
3月 03 22:43:00 server root[123648]: TEST
3月 03 22:43:15 server root[123657]: TEST
タイマを停止します。
[root@server ~]# systemctl stop run-r854d2350edc84d9b90dcac664ebd723e.timer
###3.2.3 タイマを指定した時、分、秒で起動する方法
ここでは、タイマを2021年3月3日の23時10分00秒に起動してみます。
[root@server ~]# systemd-run --on-calendar='2021-03-03 23:10:00' --timer-property=AccuracySec=1s logger -p crit TEST
[root@server ~]# journalctl -f -p crit
-- Logs begin at Wed 2021-03-03 20:22:13 JST. --
3月 03 23:10:00 server root[124336]: TEST
#4 タイマユニット、サービスユニットを使う方法
##4.1 設定ファイル編集
タイマユニットを作成します。
[root@server ~]# vi /usr/lib/systemd/system/test.timer
[root@server ~]# cat /usr/lib/systemd/system/test.timer
[Unit]
Description=Test Timer
[Timer]
OnActiveSec=5s
OnUnitActiveSec=3s
AccuracySec=100ms
Unit=test.service
[Install]
WantedBy=multi-user.target
サービスユニットを作成します。
[root@server ~]# vi /usr/lib/systemd/system/test.service
[root@server ~]# cat /usr/lib/systemd/system/test.service
[Unit]
Description=Test Service
[Service]
Type=simple
ExecStart=/usr/local/bin/test.sh
[Install]
WantedBy=multi-user.target
スクリプトを作成します。
[root@server ~]# vi /usr/local/bin/test.sh
[root@server ~]# cat /usr/local/bin/test.sh
#!/usr/bin/bash
logger -p crit TEST
作成したスクリプトに実行権を付与します。
[root@server ~]# chmod 744 /usr/local/bin/test.sh
編集した設定ファイルをシステムに読み込ませます。
[root@server ~]# systemctl daemon-reload
##4.2 実行結果
タイマを起動します。
[root@server ~]# systemctl start test.timer
実行結果を確認すると、3秒間隔でloggerコマンドが実行され、
ログにTESTが出力されていることがわかります。
[root@server ~]# journalctl -f
3月 07 22:15:07 server systemd[1]: Started Test Service.
3月 07 22:15:07 server root[5357]: TEST
3月 07 22:15:10 server systemd[1]: Started Test Service.
3月 07 22:15:10 server root[5360]: TEST
3月 07 22:15:13 server systemd[1]: Started Test Service.
3月 07 22:15:13 server root[5363]: TEST
3月 07 22:15:16 server systemd[1]: Started Test Service.
3月 07 22:15:16 server root[5366]: TEST
#Z 参考情報
systemd: timerユニットで起動日時制御
systemd .timerについて
systemd service timer example
Next Generation Cron With systemd: Creating A Timer
第539回 LXDのコンテナからSR-IOV対応デバイスを利用する
https://stackoverflow.com/questions/62578603/only-use-systemd-timer-oncalendar-events