ソケットが受信中であるかどうかを確認する方法は?

ソケットが受信中であるかどうかを確認する方法は?

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

現在、すべてのリスニングソケットをリストしssますgrep

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

ソケットの状態を確認するより良い方法はありますか?

答え1

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

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
  • プロセスは、自分が聞いているという事実をどのプロセスにも知らせません。

答え2

デバイスとinode番号に基づいて一致させることができます。

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

終了ステータスにのみ興味がある場合は、-qオプションを指定してください(0 =ファイルを受信するプロセスがある場合は成功)。grep

関連ビュー回答そして、説明と問題へのリンク、特に返されたデバイス番号の誤った形式の一部ですss

何かを聞いているかどうかを調べるためにソケットに接続しようとしているのは、誰かがまだ生きているかどうかを調べるために誰かを尋ねるのと同じです;-)

答え3

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

telnet localhost <port>

ただし、スクリプトを作成して定期的に確認したいようです。上記の素晴らしい答えに加えて、これを行う方法の例があります。

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または0ではありません)を記録します。変数 "r" はこの値を取得します。

0(オープン)または0以外の(クローズ)変数$ rがあります。ここでは、結果をエコーし​​たり、ログファイルに書き込んだり、結果を電子メールで送信したりすることができます。 cronジョブとして実行できます。

HTH。

関連情報