bash
私はシェルコマンド(主に)を使用して特定のホストが動作していることを確認するためのより多くの方法を見つけようとしています。理想的には、ホスト名とIPアドレスの両方を使用します。現在私が知っている唯一の基本的な方法はpingであり、おそらくスクリプトに統合されているかもしれません。ここで説明されているとおりです。別のアイデアがありますか?
答え1
ping
はいホストが生きていて接続されているかどうかをテストする方法です。 (ホストは有効になっていても接続が失われたり遅く応答したりすると、死んだホストとは区別できません。)
このコマンドがサポートするオプションはping
システムによって異なります。永久に繰り返されず、応答を受け取らずに数秒後に返されることを確認する必要があります。
FreeBSDおよびLinux iputilの場合は、ping -c 1 -W 1 >/dev/null
単一のpingを送信して1秒間待ちます。出力を解析する必要はありません。コマンドがpingを受け取ると0が返され、それ以外の場合は0以外の値が返されます(未知のホスト名、ホストへのパスなし、応答なし)。いくつかの実装には他のフラグが必要な場合があります(FreeBSDには-w
ありません-W
)。システムのマニュアルを確認してください。
if ping -c 1 -W 1 "$hostname_or_ip_address"; then
echo "$hostname_or_ip_address is alive"
else
echo "$hostname_or_ip_address is pining for the fjords"
fi
答え2
Ping は、ホストがネットワークに接続されているかどうかをすばやく応答するのに役立ちますが、通常、ホストがアクティブであるのか、それとも期待どおりに機能しているのかを知らせません。これは、ping応答が通常カーネルによって処理されるためです。したがって、システム上のすべてのアプリケーションがクラッシュしても(ディスク障害やメモリ不足など)、通常はまだping応答を受け取り、システムが機能していないと考えることができます。その時に走っています。状況が正確に逆の場合は、正常に動作できます。
検査サービス
ホストがまだオンラインであるかどうかはあまり気にしないことがよくあります。実際に興味を持っているのは、コンピュータがまだいくつかのタスクを実行しているかどうかです。したがって、ジョブを直接確認できる場合は、ホストが稼働中であり、ジョブが実行中であることがわかります。
たとえば、Webサーバーを実行しているリモートホストの場合は、次のことができます。
# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
echo "$TARGET alive and web site is up"
else
echo "$TARGET offline or web server problem"
fi
SSHを実行し、パスワードのないログインキーを設定する場合は、次の追加オプションがあります。
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
これはホストにSSHで接続し、コマンドを実行してから接続を閉じる方法でtrue
行われます。ssh
コマンドが正常に実行できる場合にのみ、コマンドは成功を返します。
SSHによるリモートテスト
これを拡張して特定のプロセスを確認できます。たとえば、そのプロセスがmysqld
マシンで実行されていることを確認できます。
if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
echo "$TARGET alive and running MySQL"
else
echo "$TARGET offline or MySQL crashed"
fi
もちろん、この場合、monit
サービスが引き続き実行されるようにターゲットでこのようなタスクを実行することをお勧めしますが(マシンBが準備されている場合)、マシンAで特定のタスクを実行したいスクリプトでは便利です。
rsync
これは、作業を実行する前に、ターゲットシステムに特定のファイルシステムがマウントされていることを確認して、何らかの理由でセカンダリファイルシステムがマウントされていない場合に誤ってプライマリディスクを満たさないようにすることができます。たとえば、/mnt/raid
続行する前にターゲットシステムにインストールされていることを確認してください。
if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
echo "$TARGET alive and filesystem ready to receive data"
else
echo "$TARGET offline or filesystem not mounted"
fi
カスタマーサービスなし
場合によっては、サービスに接続する簡単な方法がなく、着信TCP接続を受け入れるかどうかを確認したいが、telnet
関連ポートの宛先に接続すると、そのポートはそのままで接続が切断されません。スクリプトによって中断されます。
非常にきれいではありませんが、timeout
プログラムnetcat
の助けを借りてまだできます。たとえば、コンピュータがTCPポート445でSMB / CIFS接続を許可していることを確認して、ログインパスワードがない場合やCIFSクライアントツールが実行されていない場合でもWindowsファイル共有が実行されていることを確認できます。取付ける:
# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data. Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
echo "$TARGET alive and CIFS service available"
else
echo "$TARGET offline or CIFS unavailable"
fi