シェルコマンド(主にbash)のみを使用して、特定のホストが起動しているかどうかを確認する方法をさらに見つけようとしています。理想的には、ホスト名とIPアドレスの両方で機能することができます。現在、私が知っている唯一のネイティブな方法はping です。ここで説明するように、おそらくスクリプトに統合されています。他のアイデアは?
シェルコマンド(主にbash)のみを使用して、特定のホストが起動しているかどうかを確認する方法をさらに見つけようとしています。理想的には、ホスト名とIPアドレスの両方で機能することができます。現在、私が知っている唯一のネイティブな方法はping です。ここで説明するように、おそらくスクリプトに統合されています。他のアイデアは?
回答:
ping
あるホストが生きていると接続されているかどうかをテストする方法は。(ホストが生きているが切断されている、または応答が遅い場合、ホストが死んでいることと区別できません。)
このping
コマンドでサポートされるオプションは、システムによって異なります。それが永遠にループしないことを確認する必要がありますが、応答を受信しなかった場合は数秒後に戻ります。
FreeBSDおよびLinux iputilsではping -c 1 -W 1 >/dev/null
、単一のpingを送信して1秒間待機します。出力を解析する必要はありません。コマンドは、pingを受信した場合は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
answered
でした。OPは、more ways to see if a given host is up
での場合を除いてping
、具体的にを要求しましたが、この回答では提供されません。
"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
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
は、サービスを確実に実行し続けるために、ターゲット上で何かを実行した方がよいでしょうが、マシン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接続を受け入れるかどうかを確認するため、ログインするためのパスワードがない場合でも、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