ホストが生きているかどうかを確認するシェルコマンド/スクリプト?


9

シェルコマンド(主にbash)のみを使用して、特定のホストが起動しているかどうかを確認する方法をさらに見つけようとしています。理想的には、ホスト名とIPアドレスの両方で機能することができます。現在、私が知っている唯一のネイティブな方法はping です。ここで説明するように、おそらくスクリプトに統合されています。他のアイデアは?

回答:


7

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

私はそれが知っている私はちょうど他の方法は、奇妙なまたは気まぐれか、何を持っていても、それが唯一の方法ではありませんでした期待していた、方法。しかたがない!
user67459

2
この回答は回答としてマークされるべきではありませんansweredでした。OPは、more ways to see if a given host is upでの場合を除いてping、具体的にを要求しましたが、この回答では提供されません。
妖怪

「ping」のmanページから:"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134

@ 1111161171159459134その段落はもっと良い言葉で書かれたかもしれません。それは過度に警戒心があります。フラッディングpingや非常に高いレートのpingを行うべきではありませんが、時々1つのpingパケットは無視できます。
Gilles 'SO-悪をやめる'

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が、問題のポートのターゲットに到達すると、そこに座っているだけで切断されません。つまり、そうすることを意味しますスクリプトでは、ハングアップします。

それほどクリーンではありませんが、timeoutnetcatプログラムを使用してこれを行うことができます。たとえば、これはマシンが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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.