systemdタイマー
打たなくても回るようにする
前のレッスンで、死活を判定して記録するスクリプトができました。あとは、これを決まった間隔で勝手に走らせるだけです。
Linux で定期実行といえば長く cron でしたが、systemd を使うサーバーではタイマーという別のやり方があります。2章で .service を書いたので、下地はもうできています。
cron との違い
cron でも同じことはできます。それでもタイマーを選ぶ理由は次のとおりです。
- 実行の記録が
journalctlに残る。cron はメールに送るのが既定で、届かないと消える systemctl list-timersで、次にいつ動くかを一覧で見られる- サーバーが止まっていて実行を逃したぶんを、起動後に取り戻せる
- 失敗したときの扱いを
.service側に書ける
2章から使ってきた systemctl と journalctl が、そのまま定期実行にも効く。道具が1つで済むのがいちばんの利点です。
2つのファイルで1組
タイマーは何をするかといつするかを分けて書きます。
[Unit]
Description=Run healthcheck
[Service]
Type=oneshot
ExecStart=/root/bin/healthcheck.shこれが /etc/systemd/system/healthcheck.service です。2章で書いた .service とほぼ同じですが、Type=oneshot が違います。走って終わる処理だという宣言で、常駐しないので終わっても「落ちた」とは扱われません。[Install] も要りません。自分では起動せず、タイマーから呼ばれるだけだからです。
[Unit]
Description=Run healthcheck periodically
[Timer]
OnCalendar=*:0/2
Persistent=true
[Install]
WantedBy=timers.targetこれが /etc/systemd/system/healthcheck.timer です。拡張子の前の名前を揃えるのが決まりで、healthcheck.timer は自動的に healthcheck.service を呼びます。
いつ動かすかの書き方
OnCalendar は時刻を指定する書き方です。
*:0/2— 2分ごとhourly— 毎時 0 分daily— 毎日 0 時Mon *-*-* 09:00:00— 毎週月曜の 9 時
Persistent=true は、止まっていて逃した回のぶんを起動後すぐに走らせる指定です。日次のバックアップのように「1日1回は必ず」という処理で効きます。
有効にして確かめる
2章と同じ手順です。ファイルを置いたら読み直させます。
systemctl daemon-reload
systemctl enable --now healthcheck.timer有効にするのは .timer のほうです。.service を enable してしまうと、起動のたびに1回走るだけの設定になります。ここも取り違えの多いところです。
systemctl list-timers healthcheck.timer
# NEXT LEFT LAST PASSED UNIT ACTIVATES
# Sat 2026-08-08 12:02:00 UTC 1min 30s - - healthcheck.timer healthcheck.serviceNEXT が次の実行時刻です。ここが空なら、タイマーは動いていません。
待たずに中身だけ試したいときは、.service のほうを直に走らせます。
systemctl start healthcheck.service
journalctl -u healthcheck.service -n 20 --no-pagerタイマーの設定と、中身が正しいかは別々に確かめる。この切り分けができると、動かないときに迷いません。
手を動かす
ヘルスチェックを呼ぶ .service と .timer を書き、2分ごとに回る状態にします。