web-dev-qa-db-ja.com

ソケットが待機しているかどうかを確認するにはどうすればよいですか?

定期的にソケットの状態を確認したいので、コマンドでソケットの状態を確認する必要があります。

現在、すべてのリスニングソケットをssで一覧表示し、grepでフィルタリングします。

ss -l | grep -q /run/php/php7.0-fpm.sock

ソケットのステータスを確認するより良い方法はありますか?

6
ironsand

切断する前に、接続を試み、何も渡さず、何も受け入れないことで、いくつかの情報を取得できます。

socat -u OPEN:/dev/null UNIX-CONNECT:/run/php/php7.0-fpm.sock

少なくとも4つの結果が考えられます。

  • ソケットが存在しない場合、エラーはNo such file or directoryになり、終了ステータスは1になります。

  • ソケットへの書き込みアクセス権がない場合、エラーはPermission deniedになり、終了ステータスは1になります。この場合、リッスンしているプロセスがあるかどうかはわかりません。

  • ソケットへの書き込みアクセス権があり、リスニングプロセスがない場合、エラーはConnection refusedになり、終了ステータスは1になります。

  • ソケットへの書き込みアクセス権があり、リッスンするプロセスがある場合、接続が確立されます。コマンドは何も送信せず(cat /dev/nullなど)、何も受信しようとしないため(-uのため)、コマンドはほとんどすぐに終了します。終了ステータスは0になります。

    接続が確立されますが、短時間ですがまだです。リスニングプロセスは、1つの接続のみを受け入れ、それを処理して終了するように構成できます。または、一度に1つの接続を受け入れます。このような場合、プローブ接続は制限を飽和させます。これは望ましくありません。ただし、実際には、リスニングプロセスの大部分が複数の接続を提供し、冷酷に切断するクライアントに適切に対処できると期待しています。

ノート:

  • Stderrを解析して、終了ステータス1を生成するケースを区別する必要があります。
  • この手順では、どのプロセスがリッスンしているかについては何もわかりません。
3

デバイスとiノード番号で一致させることができます。

ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)"

-qオプションをgrepに設定すると、その終了ステータスのみが重要になります(そのファイルをリッスンしているプロセスがある場合、0 =成功)。

関連する answer とそこからリンクされているものの説明と落とし穴、特にssによって返されるデバイス番号のバグのある形式に関する部分を参照してください。

ソケットに接続して、何かがそれをリッスンしているかどうかを判断することは、誰かがまだ生きているかどうかを確認するために誰かを噛むようなものです;-)

1
mosvy

ポートが開いているかどうかを確認したいだけの場合は、次のようにtelnetを使用することをお勧めします。

telnet localhost <port>

ただし、スクリプトを作成して、定期的にチェックを続けたいようです。上記の優れた答えに加えて、これを行う方法の例を次に示します。

Chuss でSEの投稿を承認し、それがどのように機能するかについての情報を追加しています。

Host=localhost; port=222
r=$(bash -c 'exec 3<> /dev/tcp/'$Host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
      echo "$Host $port is open";
 else
      echo "$Host $port is closed"; 
fi

これが 説明 という行です。

  • bash -cは、空の環境でコマンドを実行します。
  • exec 3<> /dev/tcp/'$Host'/'$port'読み取り/書き込み用に/ dev/tcp/'$ Host'/'$ port'を開きます。
  • echo $?最後のコマンドの終了コード(0またはゼロ以外)を記録します。変数「r」はこの値を取得します。

0(open)またはnon-zero(closed)の変数$ rができました。それに基づいて、結果をエコーし​​たり、ログファイルに書き込んだり、出力をメールで送信します。これはcronジョブとして実行できます。

HTH。

0
Hopping Bunny