タイマの使い方

#1 はじめに
以下の2通りの方法でタイマの動作確認をしてみます。
・systemd-runコマンド
・タイマユニットファイル、サービスユニットファイル

#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```


#3 systemd-runコマンドを使う方法

##3.1 モノトニックタイマの使い方

###3.1.1 1回だけ実行する場合
systemd-runの実行結果を確認するため、journalctlコマンドを実行します。

```console:ログの確認
[root@server ~]# journalctl -f
```

ターミナルをもう1つオープンします。
タイマを起動してから5秒後にloggerコマンドを1回だけ実行してみます。
タイマの精度は100msに設定しました。タイマの精度を指定しないと、精度は1分になるようです。

```console:タイマの起動
[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`が出力されていることがわかります。

```console:実行結果
[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コマンドを実行してみます。

```console:タイマの起動
[root@server ~]# systemd-run --on-active=5 --on-unit-active=2  --timer-property=AccuracySec=100ms /usr/bin/logger TEST
```

タイマを起動してから5秒後に`TEST`が出力され、その後、
2秒間隔で`TEST`が出力されていることがわかります。

```console:実行結果
[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.
```

タイマを停止します。

```console:タイマの停止
[root@server ~]# systemctl stop run-rd31c925c098042a69aa6b5cb75484101.timer
```



##3.2 カレンダータイマの使い方


###3.2.1 タイマを毎分起動する方法
7時1分、7時2分というように、毎分タイマを起動してみます。
タイマの精度(AccuracySec)は1分にしてみました。
なお、`--on-calendar`の書式は、`年-月-日 時:分:秒`です。

```console:タイマの起動
[root@server ~]# systemd-run --on-calendar='*-*-* *:*:00' --timer-property=AccuracySec=1s logger TEST
```
22時33分,22時34分,22時35分というように、毎分タイマが起動され、loggerコマンドが
実行されていることがわかります。

```console:実行結果
[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.
```

タイマを停止します。

```console:タイマの停止
[root@server ~]# systemctl stop run-r854d2350edc84d9b90dcac664ebd723e.timer
```


###3.2.2 タイマを指定した秒で起動する方法
タイマを毎分の0秒,15秒,30秒,45秒で起動してみます。

```console:タイマの起動
[root@server ~]# systemd-run --on-calendar='*-*-* *:*:0,15,30,45' --timer-property=AccuracySec=1s logger -p crit TEST
```

```console:実行結果
[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
```

タイマを停止します。

```console:タイマの停止
[root@server ~]# systemctl stop run-r854d2350edc84d9b90dcac664ebd723e.timer
```

###3.2.3 タイマを指定した時、分、秒で起動する方法
ここでは、タイマを2021年3月3日の23時10分00秒に起動してみます。

```console:タイマの起動
[root@server ~]# systemd-run --on-calendar='2021-03-03 23:10:00' --timer-property=AccuracySec=1s logger -p crit TEST
```


```console:実行結果
[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 設定ファイル編集
タイマユニットを作成します。

```console:タイマユニット
[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
```

サービスユニットを作成します。

```console:サービスユニット
[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
```

スクリプトを作成します。

```console:スクリプトの内容
[root@server ~]# vi /usr/local/bin/test.sh
[root@server ~]# cat /usr/local/bin/test.sh
#!/usr/bin/bash
logger -p crit TEST
```

作成したスクリプトに実行権を付与します。

```console:実行権付与
[root@server ~]# chmod 744 /usr/local/bin/test.sh
```

編集した設定ファイルをシステムに読み込ませます。

```console:設定ファイルの読み込み
[root@server ~]# systemctl daemon-reload
```

##4.2 実行結果

タイマを起動します。

```console:タイマの起動
[root@server ~]# systemctl start test.timer
```


実行結果を確認すると、3秒間隔でloggerコマンドが実行され、
ログにTESTが出力されていることがわかります。

```console:実行結果
[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ユニットで起動日時制御](https://memo.open-code.club/Linux/systemd/timer%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88.html)
[systemd .timerについて](https://www.souichi.club/raspberrypi/systemd-timer/#OnActiveSec)
[systemd service timer example](https://twpower.github.io/212-systemd-timer-example-en)
[Next Generation Cron With systemd: Creating A Timer](https://linuxhint.com/cron_systemd_timer/)
[第539回　LXDのコンテナからSR-IOV対応デバイスを利用する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0539?page=3)
https://stackoverflow.com/questions/62578603/only-use-systemd-timer-oncalendar-events

[Using systemd features to secure services](https://www.redhat.com/sysadmin/systemd-secure-services)