有没有办法将networking连接绑定到一个PID(进程ID),而不分叉到LSF或NETSTAT?
目前正在使用lsof来查询哪个连接属于哪个进程ID。 但是,在繁忙的主机上,lsof或netstat可能会相当昂贵,并且希望避免必须分叉这些工具。
有没有类似于/ proc / $ pid的地方可以find这些信息? 我通过检查/ proc / net知道networking连接是什么,但是无法弄清楚如何将它连接到一个pid。 在/ proc / $ pid中,似乎没有任何networking信息。
目标主机是Linux 2.4和Solaris 8到10.如果可能的话,在Perl中有一个解决scheme,但愿意做C / C ++。
补充笔记:
我想强调这里的目标是将一个networking连接绑定到一个PID。 find一个或那个是微不足道的,但以低成本的方式将两者结合在一起似乎是困难的。 感谢迄今为止的答案!
我不知道你需要多长时间进行一次轮询,或者你的意思是“昂贵”,但是选择正确的选项, netstat
和lsof
运行速度比默认配置快很多。
例子:
netstat -ltn
只显示出来,并省略默认打开的(缓慢)分辨率。
lsof -b -n -i4tcp:80
省略所有b锁定操作,并将选择限制在端口80上的IPv4 tcp套接字。
在Solaris上,您可以使用pfiles(1)
来执行此操作:
# 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
对于Linux,这是更复杂(可怕):
# 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:0016
是0.0.0.0:22
。 这是netstat -a
的等效输出:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
你为什么不看netstat的源代码,看看它是如何得到的信息? 它是开源的。
对于Linux,看看/proc/net
目录(例如, cat /proc/net/tcp
列出了你的tcp连接)。 不确定Solaris。
这里有更多的信息。
我猜netstat基本上使用这个完全相同的信息,所以我不知道你是否能够加快它的一大堆。 请务必尝试使用netstat'-an'标志来实时解析ip-adress到主机名(由于dns查询,这可能需要很长时间)。
最简单的事情是
strace -f netstat -na
在Linux上(我不知道Solaris)。 这会给你一个所有系统调用的日志。 这是很多的输出,其中一些将是相关的。 看看它打开的/ proc文件系统中的文件。 这应该引导你如何netstat做到这一点。 不寻常的是,ltrace会允许你通过c库做同样的事情。 在这种情况下对你没有用处,但在其他情况下可能有用。
如果不清楚的话,请看一下源代码。
看看这些答案,彻底探索可用的选项: