如何在不使用lsof或netstat的情况下将网络连接绑定到PID?

时间:2009-05-08 05:08:28

标签: linux networking solaris pid

有没有办法将网络连接与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。获得一个或另一个是微不足道的,但是以低成本的方式将两者结合在一起似乎很困难。感谢到目前为止的答案!

6 个答案:

答案 0 :(得分:8)

我不知道你需要多长时间进行一次民意调查,或者你的意思是“昂贵”,但是如果选择正确,netstatlsof的运行速度要比默认配置快得多。
例子:

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:00160.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)