手当たり次第に書くんだ

CentOS8 systemdを使用した定期実行

目次に戻る

概要

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.

目次に戻る

CentOS8 systemdを使用した定期実行

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トップへ戻る