ヘルスチェック

「見たら動いていた」では足りない

ここまで、動いているかどうかは自分の目で確かめてきました。curl を打ち、返ってきた文字を読む。人がいる間はこれで十分です。

困るのは、人がいない時間です。夜中に落ちたサーバーは、朝まで誰にも気づかれません。必要なのは、人の代わりに見て、結果を残す仕組みです。

そのために、まず「生きている」を機械が判定できる形に落とします。

終了コードで判定する

シェルのコマンドは、終わるときに 0 から 255 の数を返します。0 が成功、それ以外が失敗です。この数は $? で読めます。

curl -skf https://localhost/ > /dev/null echo $? # 0

-f が要点です。この指定を付けると、HTTP のステータスが 400 以上のとき curl 自身が失敗として終わります。付けないと、404 が返ってきても curl としては「取得に成功した」ので 0 を返します。死活判定で -f を落とすのは定番の失敗です

判定に使う残りの指定は次のとおりです。

  • -s — 進捗表示を出さない
  • -k — 自己署名証明書を受け入れる
  • --max-time 5 — 5秒で見切りをつける

最後の見切りが効きます。応答しないサーバーに繋ぎに行くと、指定しなければ長く待ち続けます。判定が返ってこないのは、失敗が返ってこないのと同じです。

if で分岐を書く

終了コードは if にそのまま渡せます。

if curl -skf --max-time 5 https://localhost/ > /dev/null; then echo "OK" else echo "NG" fi

if は、続くコマンドの終了コードが 0 なら then を、そうでなければ else を実行します。他の言語のように真偽値を比べる必要はありません。コマンドの成否がそのまま条件になるのが、シェルの書き方です。

記録には時刻を必ず付ける

判定結果は追記していきます。

date '+%Y-%m-%d %H:%M:%S' # 2026-08-08 12:00:00

date は書式を指定できます。%Y が西暦、%m が月、%d が日、%H:%M:%S が時刻です。

書き込みは > ではなく >> を使います。> は毎回上書きなので、直前の1件しか残りません。いつから落ちていたのかは、履歴が無いと分かりません

echo "$(date '+%Y-%m-%d %H:%M:%S') OK" >> /var/log/healthcheck.log

1章から使ってきた $(...) は、中のコマンドの出力をその場に埋め込む書き方です。

スクリプトにまとめる

Linux 入門で作った backup.sh と同じ形にします。1行目の #!/bin/bash で、この中身を bash に読ませると宣言し、chmod +x で実行できるようにします。

次の章でこれをタイマーに繋ぎます。人が打たなくても、決まった間隔で回り続ける状態が、この2レッスンの行き先です。

手を動かす

サイトが 200 を返すかどうかで OK と NG を判定し、時刻つきで記録するスクリプトを書きます。

ヒント

  • 1. /root/bin/healthcheck.sh を作り、1行目に #!/bin/bash を書く
  • 2. curl -skf --max-time 5 https://localhost/ の成否を if で分岐させる
  • 3. 成功なら OK、失敗なら NG を、date の時刻とあわせて /var/log/healthcheck.log へ >> で追記する
  • 4. chmod +x /root/bin/healthcheck.sh で実行できるようにする
  • 5. 2回実行して、記録が2行に増えることを確かめる

10 項目で採点します