有没有办法将网络连接与PID(进程ID)联系起来而不需要转换为lsof或netstat?
目前lsof用于轮询哪些连接属于哪个进程ID。但是lsof或netstat在繁忙的主机上可能非常昂贵,并且希望避免使用这些工具。
是否有类似于/ proc / $ pid的地方可以找到这些信息?我通过检查/ proc / net知道网络连接是什么,但无法弄清楚如何将其绑定到pid。在/ proc / $ pid中,似乎没有任何网络信息。
目标主机是Linux 2.4和Solaris 8到10.如果可能,请使用Perl中的解决方案,但我愿意做C / C ++。
附加说明:
我想强调这里的目标是将网络连接绑定到PID。获得一个或另一个是微不足道的,但是以低成本的方式将两者结合在一起似乎很困难。感谢到目前为止的答案!
答案 0 :(得分:8)
我不知道你需要多长时间进行一次民意调查,或者你的意思是“昂贵”,但是如果选择正确,netstat
和lsof
的运行速度要比默认配置快得多。
例子:
netstat -ltn
仅显示 l istening t cp套接字,并省略默认启用的(慢) n ame解析。
lsof -b -n -i4tcp:80
省略所有 b 锁定操作, n ame解析,并将选择限制为端口80上的IPv4 tcp套接字。
答案 1 :(得分:6)
在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
答案 2 :(得分:1)
为什么不查看 netstat 的源代码,看看它是如何获取信息的?它是开源的。
答案 3 :(得分:1)
对于Linux,请查看/proc/net
目录
(例如,cat /proc/net/tcp
列出了您的tcp连接)。不确定Solaris。
更多信息here。
我猜netstat基本上使用了这个完全相同的信息,所以我不知道你是否能够加快它的速度。一定要尝试使用netstat'-an'标志来解决实时主机名的ip-adresses(因为dns查询需要花费很多时间)。
答案 4 :(得分:1)
最简单的事情是
strace -f netstat -na
在Linux上(我不知道Solaris)。这将为您提供所有系统调用的日志。这是很多输出,其中一些是相关的。查看它正在打开的/ proc文件系统中的文件。这应该引导您了解netstat的工作方式。不好意思,ltrace允许你通过c库做同样的事情。在这种情况下对你没用,但在其他情况下它可能很有用。
如果不清楚,请查看来源。
答案 5 :(得分:0)