'ss' は、同じポートに複数のリスニング PID を表示します。

'ss' は、同じポートに複数のリスニング PID を表示します。

本番コードには「netstat」を使用するshスクリプトがあります。特定のポートでリッスンしているすべてのPIDを取得するには、「netstat -lntup」コマンドを使用します。コマンドをss -lntupに置き換えました。ほとんどの場合、両方のコマンドの出力は同じですが、場合によっては、ssは同じポートに対して複数のpidを返します。

# ss -lntup | grep http

tcp  LISTEN 0  128  *:80  *:*  users:(("httpd",pid=2355,fd=4),("httpd",pid=1962,fd=4),("httpd",pid=1961,fd=4),("httpd",pid=1960,fd=4),("httpd",pid=1955,fd=4))

tcp  LISTEN 0  128  *:443  *:*  users:(("httpd",pid=2355,fd=6),("httpd",pid=1962,fd=6),("httpd",pid=1961,fd=6),("httpd",pid=1960,fd=6),("httpd",pid=1955,fd=6))

このリストをどのように解釈する必要がありますか? PIDはどのように関係していますか?複数のプロセスが同時に同じPIDを受信できますか?

ありがとう

ベストアンサー1

PIDはどのように関係していますか?

この場合は明らかにそうです。共通の親プロセスがあるか、プロセスの1つが別のプロセスの親です。

パブリックファイルハンドル(ポート80の場合4、ポート443の場合6)は、子プロセスを開始する前に親プロセスが「ソケット」を生成したことを示します。

複数のプロセスが同時に同じポートを受信できますか?

ポートを受信するプロセス(pid)ではなく、ポートが受信する「ソケット」です。

ソケットは、コンピュータのメモリ内のネットワーク関連オブジェクトです。

Eduardo Trápaniがすでに作成したように、SO_REUSEPORTを使用すると、複数のソケットがポートでリッスンできます。しかし、ここでは(おそらく)そうではありません。 2つのソケットのみが関連付けられているとします(ポート80に1つ、ポート443に1つ)。

プロセス(pid)がソケットを作成してから子プロセスを作成すると、そのプロセスとその子プロセスは通常、子プロセスが作成された後にソケットを共有します。

オペレーティングシステムはどのソケットがどのポートでリッスンしているかを知っていますが、ソケットは(少なくとも正式に)複数のPID間で共有されるため、実際にリッスンしているPIDを見つける方法はありません。

私は親プロセスだけが実際にソケットを使用していると仮定していますが、オペレーティングシステムはこれを知りません。

おすすめ記事