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