シェルコマンド(主にbash)のみを使用して、特定のホストが起動しているかどうかを確認する方法をさらに見つけようとしています。理想的には、ホスト名とIPアドレスの両方で機能することができます。現在私が知っている唯一のネイティブな方法はpingで、おそらくスクリプトに統合されています ここで説明されているように 他のアイデアはありますか?
ping
isホストがアクティブで接続されているかどうかをテストする方法。 (ホストが生きているが切断されているか、応答が遅い場合、ホストが死んでいることと区別できません。)
ping
コマンドでサポートされるオプションは、システムによって異なります。それが永遠にループしないことを確認する必要がありますが、応答を受信しなかった場合は数秒後に戻ります。
FreeBSDおよびLinux iputilsでは、ping -c 1 -W 1 >/dev/null
は単一のpingを送信し、1秒間待機します。出力を解析する必要はありません。コマンドは、pingを受信した場合は0を返し、それ以外の場合はゼロ以外を返します(不明なホスト名、ホストへのルートなし、応答なし)。一部の実装では異なるフラグが必要な場合があります(例:-w
の代わりに -W
(FreeBSDの場合)、システムのマニュアルを確認してください。
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
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
コマンドは、そのコマンドが正常に実行された場合にのみ成功を返します。
これを拡張して、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
のようなものを実行する方がよいでしょうが、マシンAでいくつかのタスクのみを実行する必要があるスクリプトでは便利です。マシンBはその準備ができています。
これは、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接続を受け入れるかどうかを確認します。これにより、ログに記録するパスワードがない場合でも、Windowsファイル共有が実行されているかどうかを確認できます。または、CIFSクライアントツールがインストールされていません。
# 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