systemd timerによる定期実行

定期実行について取り扱う。参考文献のほぼ引用の内容となっている。

Reference

Cronとの違い

  • cron: 時間に従って、実行
  • systemd timer: 状態管理しながら、実行

適する場面に応じて、使い分けることが必要。

使い方

下のSERVICE file, TIMER file, Shellを作成する。続いて下のCommandsに従って、実行を設定する。

SERVICE file

cat <<'EOF' > /etc/systemd/system/test.service
[Unit]
Description=test script

[Service]
Type=oneshot
ExecStart=bash /tmp/test.sh
EOF

ExecStartの書き方について、実行するシェル名を直接書いてもいいが、SELinuxが作動し、Permission deniedで実行できなかった(timerに限らず、systemdファイルの記載時によく起こりうる)。避ける方法としては、ファイルのSELinux Contextsを修正する、またはbash "shell name"のように、bashを実行させるよう見せかける必要がある。今回の検証では、後者を採用している。まさか、SELinuxを動作させない管理者なんて居ない。まさかね。

TIMER file

cat <<'EOF' > /etc/systemd/system/test.timer
[Unit]
Description=Run test script

[Timer]
OnCalendar=minutely

[Install]
WantedBy=timers.target
EOF

Persistent=trueで、実行時刻を逃しても後で実行できる。

知っておくとちょっと便利!systemd.timer によるタスク管理2 | SIOS Tech Labより、

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分後)

OnCalendar=1999-12-31 12:34:56というように書ける。

Shell

chmod +x /tmp/test.sh
cat <<'EOF' > /tmp/test.sh
#!/bin/bash
echo "$(date)" >> /tmp/test
EOF

Commands

実行(実行登録)

systemctl daemon-reload
systemctl enable --now test.timer

次回実行予定の確認

systemctl list-timers --all

ログ確認

journalctl -u test.service
clean env for test
#systemctl stop test.timer
systemctl disable test.timer

rm \
  /etc/systemd/system/test.service \
  /etc/systemd/system/test.timer \
  /tmp/test.sh

参考文献

上部に記載