Contents
概要
crontabの代わりにsystemdを使用してプログラムを定期実行します。crontabも使用はできますが、systemdは時間間隔が秒単位で指定出来る等のメリットもあり、systemdが利用できる環境ではsystemdを使用したほうが良いでしょう。
前提条件
OS
CentOS Stream 8を使用します。
SELinux
有効です。無効にする場合はこちらを参照して下さい。
Firewalld
無効です。有効化する場合はこちらを参照して必要な許可設定をして下さい。
設定
テスト用のスクリプト
動作確認用のスクリプトを配置します。実行すると単にsystemdtestを出力するだけです。
[root@centos ~]# vi /usr/local/bin/systemdtest #!/bin/bash echo systemdtest [root@centos ~]# chmod 700 /usr/local/bin/systemdtest
crontabを使用する場合は、標準出力を/dev/nullに捨てる、またはファイルにリダイレクト等でディスプレイに表示しないように工夫していましたが、systemdから実行する場合は、デフォルトでjournalに出力するようになっている為、その観点では不要となります。また、出力先はStandardOutputで変更が可能です。
ユニットファイル
.serviceのユニットファイルを作成します。ExecStartで前述のテスト用スクリプトを指定します。尚、良くある凡例では、[Unit]セクションにDescriptionを設定していますが、ただの説明の役割(systemctl statusで表示されます)ですので、ユニットファイル名から推測できるようであれば不要です。
[root@centos ~]# vi /etc/systemd/system/systemdtest.service
[Service]
ExecStart=/usr/local/bin/systemdtest
.timerのユニットファイルを作成します。このファイルで指定した特定の日時、または時間間隔でテスト用スクリプトを実行できるようになります。重要な点として.serviceのユニットファイル名を合わせる必要があります。異なる場合は個別に指定が必要です。
特定の時間に実行
下記の例では毎日4時に実行されます。WantedByはsystemctl enableとした際に、どこにシンボリックリンクを配置するかを設定しています。下記の場合「/etc/systemd/system/timers.target.wants」となります。
[root@centos ~]# vi /etc/systemd/system/systemdtest.timer
[Timer]
OnCalendar=*-*-* 04:00:00
[Install]
WantedBy=timers.target
特定の時間間隔で実行
下記の例では60秒間間隔で実行されます。AccuracySecは時間の精度を設定しています。
[root@centos ~]# vi /etc/systemd/system/systemdtest.timer
[Timer]
AccuracySec=1
OnUnitActiveSec=60
[Install]
WantedBy=timers.target
上記の補足ですが、下記のよく見かける設定では1分間隔で動きませんでした。おそらくですがAccuracySecが必須なのかも知れません。
[root@centos ~]# vi /etc/systemd/system/systemdtest.timer
[Timer]
OnUnitActiveSec=1min
[Install]
WantedBy=timers.target
起動設定
有効にするのは.timerのユニットファイルだけです。
[root@centos ~]# systemctl enable --now systemdtest.timer [root@centos ~]# systemctl status systemdtest.timer
確認
指定した時間でsystemdtestが出力することを確認できます。
[root@centos ~]# journalctl -f
アクティブなタイマーを確認できます。
[root@centos ~]# systemctl -t timer UNIT LOAD ACTIVE SUB DESCRIPTION dnf-makecache.timer loaded active waiting dnf makecache --timer systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories systemdtest.timer loaded active waiting systemdtest.timer unbound-anchor.timer loaded active waiting daily update of the root trust anchor for DNSSEC LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 4 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
タイマーの状態を確認できます。LEFTは次回実行までの時間ですね。
[root@centos ~]# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2021-07-06 15:49:32 JST 39s left Tue 2021-07-06 15:48:32 JST 20s ago systemdtest.timer systemdtest.service Tue 2021-07-06 16:35:39 JST 46min left Tue 2021-07-06 15:04:33 JST 44min ago dnf-makecache.timer dnf-makecache.service Tue 2021-07-06 17:27:33 JST 1h 38min left Mon 2021-07-05 17:27:33 JST 22h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Wed 2021-07-07 00:00:00 JST 8h left n/a n/a unbound-anchor.timer unbound-anchor.service 4 timers listed. Pass --all to see loaded but inactive timers, too.