9

lsof または netstat に fork せずに、ネットワーク接続を PID (プロセス ID) に関連付ける方法はありますか?

現在、lsof は、どの接続がどのプロセス ID に属しているかをポーリングするために使用されています。ただし、ビジー状態のホストでは lsof や netstat は非常に高価になる可能性があるため、これらのツールに fork する必要は避けたいと考えています。

/proc/$pid のような場所で、この情報を見つけることができますか? /proc/net を調べて、ネットワーク接続が何であるかを知っていますが、これを pid に結び付ける方法がわかりません。/proc/$pid には、ネットワーク情報がないようです。

ターゲット ホストは、Linux 2.4 および Solaris 8 ~ 10 です。可能であれば、Perl でのソリューションですが、C/C++ を実行したいと考えています。

その他の注意事項:

ここで強調したいのは、ネットワーク接続を PID に結び付けることです。どちらか一方を取得するのは簡単ですが、2 つを低コストで組み合わせるのは難しいようです。これまでの回答ありがとうございます!

4

6 に答える 6

8

どのくらいの頻度でポーリングする必要があるか、または「高価」とはどういう意味かはわかりませんが、適切なオプションを使用すると、デフォルト構成よりもはるかに高速netstatに実行されます. 例:lsof

netstat -ltn

リッスン中のt cpソケットのみを表示し、デフォルトでオンになっている (遅い) 名前解決を省略ます。

lsof -b -n -i4tcp:80

すべてのブロック操作と名前解決を省略し、選択をポート 80 のIPv4 tcp ソケットに制限します

于 2009-05-08T06:11:43.903 に答える
1

netstatのソース コードを見て、どのように情報を取得しているかを調べてみませんか? オープンソースです。

于 2009-05-08T05:40:34.853 に答える
1

Linux の場合は、/proc/netディレクトリを調べます (たとえば、cat /proc/net/tcptcp 接続を一覧表示します)。ソラリスについては不明です。

ここにいくつかの詳細情報があります。

netstat は基本的にこれとまったく同じ情報を使用していると思いますので、大幅に高速化できるかどうかはわかりません。IPアドレスをリアルタイムでホスト名に解決しないように、必ずnetstatの「-an」フラグを試してください(これにはDNSクエリのために多くの時間がかかる可能性があるため)。

于 2009-05-08T05:56:21.100 に答える
1

一番簡単なのは

strace -f netstat -na

Linux の場合 (Solaris については知りません)。これにより、行われたすべてのシステム コールのログが得られます。それは多くの出力であり、そのうちのいくつかは関連します。開いている /proc ファイル システム内のファイルを確認します。これにより、netstat がどのように動作するかがわかります。不適切なことに、ltrace を使用すると、c ライブラリを介して同じことができます。この場合は役に立ちませんが、他の状況では役立つ可能性があります。

それがはっきりしない場合は、ソースを見てください。

于 2009-05-08T06:04:58.430 に答える
0

利用可能なオプションを徹底的に調査するこれらの回答を見てください。

于 2010-10-30T04:08:35.803 に答える