このスクリプトが返すエラーの種類(500、503、402など)をキャプチャしてメッセージに追加するにはどうすればよいですか?
#!/bin/bash
hostlist=(s-colin.coverhound.us s-joe.coverhound.us)
for host in "${hostlist[@]}"; do
if nc -w 2 -z $host 80; then
echo "INFO: ssh on $host responding [Looks Good]"
else
echo "ERROR: ssh on $host not responding[Ooops something went
wrong]"
fi
done
答え1
現在、スクリプトはHTTP要求を実行しないため、HTTP応答がないため、報告するHTTP結果コードもありません。nc -z
TCP接続の確立を試みた直後に終了し、成功したかどうかを通知します。適切なHTTPクライアントはこれを行いません。 TCP接続が確立されたら、有効なHTTPGET
または要求を送信してPOST
サーバーへの応答を待ってから、何らかの方法でユーザーに報告します。
たとえば、接続を正常にcurl
テストするには、スクリプトに他のタスクを追加する必要があるかもしれません。nc
何をテストするのか正確にはわかりませんが、一般的に確認したいのは、スタートページのインポートが機能しているかどうかです。
if curl -s http://$host/ >/dev/null; then
echo "INFO: fetching http://$host/ worked" >&2
else
rc=$?
echo "ERROR: fetching http://$host/ failed (curl exit code $rc)" >&2
exit $rc
fi
特定のHTTP結果コードを返さない失敗シナリオがまだあるので、そこに入れたくありません。必ず必要な場合は、curl
可能であれば報告することは難しくありません。
最も重要なことは、テスト中のコンテンツとHTTPトランザクション全体がネットワークレベルでどのように見えるかを理解する必要があることです(テストする場合)。
また、診断出力は標準エラー(リダイレクト済み>&2
)に切り替わります。
シェルスクリプトに正しいネットワークテストスクリプトを書くことは、間違っている可能性があることが多すぎるため、うるさいことです。物理ネットワークデバイスが1つ以上ありますか?ケーブルが接続されていますか?ネットワークへのルートはありますか?リモートホストの名前を確認できますか?指定されたポートに接続できますか? (現在のスクリプトでこれをテストします。)その接続を受信するエントリは予想されるプロトコルに従いますか?簡単なリクエストを処理できますか?特定の重要な要求を処理しますか?正しく処理されましたか?サーバー側とクライアント側で受信した応答の結果が私たちの期待と一致していましたか? (たとえば、バックエンドにデータベース保持状態がある場合、現在の状態は異なりますか?ただ私たちがテストしている一つの側面ですか? )
一般的な迷惑はテストしてGET /static-page
欲しいものが見つからないことです。本物500サーバーエラーを返すことは効果的ですが、POST /dynamic-content
ペイロードテストは自動化するのが難しいか退屈なので、決して実行しません。