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
参考文献
上部に記載
◀︎ コールドバックアップ・リストア