web-dev-qa-db-ja.com

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

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

9
user67459

pingisホストがアクティブで接続されているかどうかをテストする方法。 (ホストが生きているが切断されているか、応答が遅い場合、ホストが死んでいることと区別できません。)

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コマンドは、そのコマンドが正常に実行された場合にのみ成功を返します。

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
2
Malvineous