ミッション スクリプトのサービス化
監視は、人が見張ることではない
サイトが落ちたことに気づくのが翌朝では遅すぎます。とはいえ、画面をずっと見ているわけにもいきません。そこで、定期的に自分のサイトへリクエストを送り、結果を記録し続けるプログラムを常駐させます。この章で学んだ道具だけで作れます。
作るものは次の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
donewhile 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.logenable --now は、自動起動の設定と即時の起動を一度に行う書き方です。ログに時刻と 200 が並び始めれば、監視が回っています。
手を動かす
監視スクリプトを置き、サービスとして登録し、自動起動まで設定してください。ログに記録が残っている状態がゴールです。