我的Linux系统上的一个进程,strace告诉我,正在讨论一个有文件描述符10的套接字.lsof告诉我这是一个带有inode 11085的unix套接字,而netstat进一步告诉我inode 11085是一个流套接字,它已经连接起来了。
鉴于此进程没有任何其他线程,因此系统上必须有另一个连接到此套接字另一端的进程。我怎么知道它是什么?
更新
lsof作者here有一些启发。从本质上讲,Linux似乎并不提供这些信息。
答案 0 :(得分:11)
ss -p
会告诉你。 (如果套接字不归内核本身所有。)
答案 1 :(得分:7)
netstat -p
有帮助吗?
来自Manpage:
-p,
--program Show the PID and name of the program to which each socket belongs.
答案 2 :(得分:4)
这个怎么样:grep 11085 /proc/net/unix
。假设在您感兴趣的inode的行上存在非空路径,grep
为/proc/net/unix
中的路径找到连接另一端的inode,然后使用@ efficientjelly将另一个inode映射到pid
的方法。
这里的一个关键点是两个连接的套接字每个都有不同的inode编号。
答案 3 :(得分:2)
看起来如果你真的很绝望,你可以使用一些内核调试器直接从Linux内核内存中获取这些信息。使用RHEL5的“崩溃”工具:
vmlinux
图像(例如,安装kernel-debuginfo
rpm,或从该rpm中提取vmlinux
文件)crash /path/to/vmlinux
net -s 12345
列出了PID
12345 UNIX:STREAM
),并记下它的SOCK
值:
PID: 12345 TASK: e903d000 CPU: 0 COMMAND: "someapp"
FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT DESTINATION-PORT
36 cadd0240 c8a64040 UNIX:STREAM
unix_sock struct
的地址
unix_sock.peer.name
是套接字另一端的名称结构p *(*(*((struct unix_sock*)( (struct unix_sock*)0xc8a64040)->peer)).addr).name
真的很遗憾这些信息不会直接导出到用户空间。
答案 4 :(得分:2)
我观察到了:
在客户端调用fd
的{{1}}的inode总是比从服务器端的connect()
调用返回的那个大一个。
我的编程的输出示例:
accept()
虽然client_fd=4
/proc/4436/fd/4
inode=3072
is socket
node: 3072 socket: /tmp/unix.socket
f0be8960: 00000003 00000000 00000000 0001 03 3072 /tmp/unix.socket
/proc/9293/fd/43
fd:43
inode=3073
is socket
node: 3073 socket:
f0be81e0: 00000003 00000000 00000000 0001 03 3073
中没有显示绑定路径。
YMMV,我还没有调查潜在的机制。
答案 5 :(得分:2)
我写了一个tool,它使用gdb method可靠地获取套接字对等信息,不需要内核调试符号。
要使进程连接到给定套接字,请将其传递给inode编号:
# socket_peer 11085
3703 thunderbird
要立即查找所有进程使用netstat_unix
,它会向netstat的输出添加一列:
# netstat_unix
Proto RefCnt Flags Type State I-Node PID/Program name Peer PID/Program name Path
unix 3 [ ] STREAM CONNECTED 6825 982/Xorg 1497/compiz /tmp/.X11-unix/X0
unix 3 [ ] STREAM CONNECTED 6824 1497/compiz 982/Xorg
unix 3 [ ] SEQPACKET CONNECTED 207142 3770/chromium-brows 17783/UMA-Session-R
unix 3 [ ] STREAM CONNECTED 204903 1523/pulseaudio 3703/thunderbird
unix 3 [ ] STREAM CONNECTED 204902 3703/thunderbird 1523/pulseaudio
unix 3 [ ] STREAM CONNECTED 204666 1523/pulseaudio 3703/thunderbird
...
如果您需要易于解析的输出,请尝试netstat_unix --dump
有关详细信息,请参阅https://github.com/lemonsqueeze/unix_sockets_peers。
有关信息,inode +1/-1 hack不可靠。它大部分时间都可以工作,但如果你运气不好,它会失败或者(更糟)返回错误的套接字。
答案 6 :(得分:1)
如果由于某种原因您没有运气适当的lsof和netstat选项,您还可以执行以下操作:
find /proc -lname '*11085*' 2> /dev/null
答案 7 :(得分:0)
lsof | grep 11085
lsof应该以root身份执行。
我一直在Linux系统上尝试使用lsof,lsof -U
显示NODE列下的所有数字都是唯一的。