2009-05-08 3 views
9

lsofまたはnetstatにフォークすることなく、ネットワーク接続をPID(プロセスID)に結びつける方法はありますか?lsofやnetstatを使用せずにPIDにネットワーク接続する方法は?

現在、どのプロセスがどの接続に属しているかをポーリングするためにlsofが使用されています。しかし、lsofやnetstatは、忙しいホストではかなり高価になり、これらのツールにフォークする必要はありません。

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

対象ホストは、Linux 2.4とSolaris 8~10です。可能であれば、Perlで解決できますが、C/C++を実行します。

その他の注意事項:

私はここでの目標を強調したいと思いPIDへのネットワーク接続を結びつけることです。どちらか一方を取得するのは簡単ですが、低コストで両者をまとめるのは難しいようです。これまでの回答をありがとう!

答えて

1

netstatのソースコードを見て、その情報がどのように得られますか?オープンソースです。

+1

私はしばらく前には、netstatをちらっと見ました。私は、それがちょうど接続のキャッシュを構築する/ proc経由で耕うと確信しています。私は魔法がそこに起こっているとは思わない。 – Duck

+0

@Duckの魔法は必要ありません:-)そして、彼は子プロセスでnetstatを実行したくないという点について指摘したので、コードをコピーするのは良い参考資料です。 – lothar

1

Linuxの場合、/proc/netディレクトリ (たとえば、cat /proc/net/tcpがあなたのTCP接続をリストしています)を見てください。 Solarisについてはわかりません。

さらに詳しい情報here

netstatは基本的に正確に同じ情報を使用しているので、スピードを上げることができるかどうかは分かりません。 ip-adressをホスト名にリアルタイムで解決しないようにするには、netstat -anフラグを使用してください(dnsクエリのために時間がかかる可能性があります)。行うには

+0

私たちは、/ proc/net/tcpを見てpidを調べる方法について知りました。 'tcp'から、uidとソケットを取得します。その後、所有者がuidで、 'fd'に同じソケットが含まれている/ proc/*をトラバースします。 残念ながら、これはSolarisでは動作しません。また、私は/ procファイルシステムによる検索が不要な解決策を望んでいました。 –

1

最も簡単な方法は、Linux上で

strace -f netstat -na 

(私はSolarisのことは知らない)です。これにより、システムコールのすべてのログが得られます。それは多くの出力であり、そのうちのいくつかは関連性があります。開いている/ procファイルシステムのファイルを見てください。これにより、netstatがどのように動作するかがわかります。間違いなく、ltraceはcライブラリを使って同じことをすることができます。この例では役に立ちませんが、他の状況では役立ちます。

それが明確でない場合は、ソースを確認してください。

8

ポーリングが必要な頻度や「高価」を意味するものはわかりませんが、適切なオプションを指定すると、netstatlsofの両方がデフォルト設定よりも高速に実行されます。
例:

netstat -ltn 

T CPソケットをisteningのみL示し、デフォルトでオンになって(遅い)N AME解像度を省略しています。

lsof -b -n -i4tcp:80 

あなたがこれを行うにpfiles(1)を使用することができます雨の解像度N、すべてBロック操作を省略し、Solarisのポート80

+1

Linuxの場合、 'netstat -tnp'は私に何が欲しいのですか? 'p'は私にpidを与え、実際それはかなり速いです。しかし、私はこの情報を得るためにネットスティットするのを避けることを望んでいました。非常に速く働くようになったが、フォークを避けたいと思う 'lsof'と同じです。 –

6

上でIPv4のTCPソケットへの選択を制限しています

をLinuxの場合
# ps -fp 308 
    UID PID PPID C STIME TTY   TIME CMD 
    root 308 255 0 22:44:07 ?   0:00 /usr/lib/ssh/sshd 
# pfiles 308 | egrep 'S_IFSOCK|sockname: ' 
    6: S_IFSOCK mode:0666 dev:326,0 ino:3255 uid:0 gid:0 size:0 
     sockname: AF_INET 192.168.1.30 port: 22 

、これは(陰惨な)複雑です:

# pgrep sshd 
3155 
# ls -l /proc/3155/fd | fgrep socket 
lrwx------ 1 root root 64 May 22 23:04 3 -> socket:[7529] 
# fgrep 7529 /proc/3155/net/tcp 
    6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 7529 1 f5baa8a0 300 0 0 2 -1    

00000000:00160.0.0.0:22です。ここでnetstat -aから同等の出力です:

tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN 
関連する問題