ミッション スクリプトのサービス化

監視は、人が見張ることではない

サイトが落ちたことに気づくのが翌朝では遅すぎます。とはいえ、画面をずっと見ているわけにもいきません。そこで、定期的に自分のサイトへリクエストを送り、結果を記録し続けるプログラムを常駐させます。この章で学んだ道具だけで作れます。

作るものは次の2つです。ひとつは監視そのものを行うスクリプト、もうひとつはそれを systemd に載せる unit ファイルです。

常駐するスクリプトの形

#!/bin/bash while true; do code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost/) echo "$(date '+%F %T') $code" >> /var/log/site-monitor.log sleep 10 done

while true は終わらない繰り返しです。中で状態を取り、記録し、少し待つ。これを永久に続けます。第1章で使った -w '%{http_code}' がここで効いてきます。ステータスコードだけを取り出せるので、そのまま記録に残せます。

本来この間隔は10秒では細かすぎますが、演習では動きがすぐ見えるように短くしています。実運用の間隔と、そもそもこれをタイマーで動かす方式は6章で扱います。

常駐するものは simple

前の回とは Type が変わります。

[Unit] Description=サイトの死活監視 After=nginx.service [Service] Type=simple ExecStart=/usr/local/bin/site-monitor.sh Restart=always [Install] WantedBy=multi-user.target

終わらないプログラムなので Type=simple です。ここを oneshot にすると、systemd は終了を待ち続けて起動が完了しません。

After=nginx.service は順番の指定です。監視される側が先に立ち上がっているようにします。

Restart=always は、何かの拍子にスクリプトが落ちても systemd が自動で立て直す指定です。監視の仕組み自体が黙って死んでいた、という事故を防ぎます。

enable するには [Install] が要る

最後の [Install] セクションは、systemctl enable を打ったときに、どこにリンクを張るかを書く場所です。前の回で見た multi-user.target.wants がここで出てきます。

このセクションを書き忘れると、enable したときに「対象がありません」と拒まれます。start はできるのに enable だけ通らない、という症状が出たら、まずここを疑ってください。

動かしたあとの確かめ方

systemctl daemon-reload systemctl enable --now site-monitor systemctl status site-monitor --no-pager tail -3 /var/log/site-monitor.log

enable --now は、自動起動の設定と即時の起動を一度に行う書き方です。ログに時刻と 200 が並び始めれば、監視が回っています。

手を動かす

監視スクリプトを置き、サービスとして登録し、自動起動まで設定してください。ログに記録が残っている状態がゴールです。

ヒント

  • 1. /usr/local/bin/site-monitor.sh を作り、実行権限を付ける
  • 2. /etc/systemd/system/site-monitor.service を書く。Type=simple と Restart=always と [Install] を含める
  • 3. systemctl daemon-reload を打つ
  • 4. systemctl enable --now site-monitor で起動と自動起動を同時に設定する
  • 5. tail /var/log/site-monitor.log で記録が増えていることを確かめる

7 項目で採点します