有没有办法将网络连接绑定到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.获得一个或另一个是微不足道的,但是以低成本的方式将两者结合在一起似乎很困难.感谢到目前为止的答案!
我不知道您需要多长时间进行一次轮询,或者您对"昂贵"的意思是什么,但是使用正确的选项netstat
并且lsof
运行速度比默认配置快得多.
例子:
netstat -ltn
仅显示l istening t cp套接字,并省略默认启用的(慢)n ame分辨率.
lsof -b -n -i4tcp:80
省略所有b锁定操作,n ame解析,并限制端口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