systemdタイマー

打たなくても回るようにする

前のレッスンで、死活を判定して記録するスクリプトができました。あとは、これを決まった間隔で勝手に走らせるだけです。

Linux で定期実行といえば長く cron でしたが、systemd を使うサーバーではタイマーという別のやり方があります。2章で .service を書いたので、下地はもうできています。

cron との違い

cron でも同じことはできます。それでもタイマーを選ぶ理由は次のとおりです。

  • 実行の記録が journalctl に残る。cron はメールに送るのが既定で、届かないと消える
  • systemctl list-timers で、次にいつ動くかを一覧で見られる
  • サーバーが止まっていて実行を逃したぶんを、起動後に取り戻せる
  • 失敗したときの扱いを .service 側に書ける

2章から使ってきた systemctljournalctl が、そのまま定期実行にも効く。道具が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.service

NEXT が次の実行時刻です。ここが空なら、タイマーは動いていません。

待たずに中身だけ試したいときは、.service のほうを直に走らせます。

systemctl start healthcheck.service journalctl -u healthcheck.service -n 20 --no-pager

タイマーの設定と、中身が正しいかは別々に確かめる。この切り分けができると、動かないときに迷いません。

手を動かす

ヘルスチェックを呼ぶ .service.timer を書き、2分ごとに回る状態にします。

ヒント

  • 1. healthcheck.service を書く。Type=oneshot と ExecStart=/root/bin/healthcheck.sh を入れる
  • 2. healthcheck.timer を書く。OnCalendar=*:0/2 と Persistent=true、WantedBy=timers.target を入れる
  • 3. systemctl daemon-reload で読み直させる
  • 4. systemctl enable --now healthcheck.timer で有効にする
  • 5. systemctl list-timers healthcheck.timer > /root/timers.txt で次の実行時刻を保存する
  • 6. systemctl start healthcheck.service で中身も直に試す

10 項目で採点します