定期的にソケットの状態を確認したいので、コマンドでソケットの状態を確認する必要があります。
現在、すべてのリスニングソケットをss
で一覧表示し、grep
でフィルタリングします。
ss -l | grep -q /run/php/php7.0-fpm.sock
ソケットのステータスを確認するより良い方法はありますか?
切断する前に、接続を試み、何も渡さず、何も受け入れないことで、いくつかの情報を取得できます。
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つの接続を受け入れます。このような場合、プローブ接続は制限を飽和させます。これは望ましくありません。ただし、実際には、リスニングプロセスの大部分が複数の接続を提供し、冷酷に切断するクライアントに適切に対処できると期待しています。
ノート:
1
を生成するケースを区別する必要があります。デバイスとiノード番号で一致させることができます。
ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)"
-q
オプションをgrep
に設定すると、その終了ステータスのみが重要になります(そのファイルをリッスンしているプロセスがある場合、0 =成功)。
関連する answer とそこからリンクされているものの説明と落とし穴、特にss
によって返されるデバイス番号のバグのある形式に関する部分を参照してください。
ソケットに接続して、何かがそれをリッスンしているかどうかを判断することは、誰かがまだ生きているかどうかを確認するために誰かを噛むようなものです;-)
ポートが開いているかどうかを確認したいだけの場合は、次のように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。