我有一个进程(dbus-daemon),它在UNIX套接字上有许多开放的连接。 其中一个连接是fd#36:
=$ ps uw -p 23284 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND depesz 23284 0.0 0.0 24680 1772 ? Ss 15:25 0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session =$ ls -l /proc/23284/fd/36 lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410] =$ netstat -nxp | grep 1013410 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) unix 3 [ ] STREAM CONNECTED 1013410 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD =$ netstat -nxp | grep dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1013953 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1013825 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1013726 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1013471 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1013410 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1012325 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1012302 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1012289 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1012151 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011957 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011937 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011900 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011775 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011771 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011769 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011766 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011663 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011635 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011627 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011540 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011480 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011349 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011312 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011284 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011250 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011231 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011155 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011061 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011049 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011035 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1011013 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1010961 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD unix 3 [ ] STREAM CONNECTED 1010945 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
基于数字连接,我假设dbus-daemon实际上是服务器。 哪个好。 但我怎么能find哪个进程连接到它 – 使用dbus-launcher中的第36个文件句柄的连接? 试过lsof甚至greps在/ proc / net / unix上,但是我找不到find客户端进程的方法。
最近我偶然发现了一个类似的问题。 我很震惊地发现,有些情况下这是不可能的。 我从lsof(Vic Abell)的创build者那里得到了一个评论,他指出这很大程度上取决于unix套接字的实现。 有时,所谓的“端点”信息是可用的,有时候不是。 不幸的是,在Linux中是不可能的,正如他指出的那样。
在Linux上,例如,lsof必须使用/ proc / net / unix,所有UNIX域套接字都有一个绑定path,但没有端点信息。 通常没有约束的path。 这经常使得不可能确定另一个端点,但这是Linux / proc文件系统实现的结果。
如果你看看/ proc / net / unix,你可以亲眼看到,至less在我的系统上,他绝对是对的。 我仍然感到震惊,因为在追踪服务器问题时,我发现这样的function至关重要。
这个答案只适用于Linux。 根据Unix&Linux Stack Exchange 的回答 ,我使用gdb
和/proc/kcore
访问,使用内核数据结构成功地确定了unix域套接字的另一端。 您需要启用CONFIG_DEBUG_INFO
和CONFIG_PROC_KCORE
内核选项。
您可以使用lsof
来获取套接字的内核地址,该地址采用指针的forms,例如0xffff8803e256d9c0
。 这个数字实际上是相关的内核内存结构或typesstruct unix_sock
。 该结构有一个叫做peer
的字段,指向socket的另一端。 所以命令
# gdb /usr/src/linux/vmlinux /proc/kcore (gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer
将打印连接另一端的地址。 你可以grep输出lsof -U
这个数字来标识另一端的进程和文件描述符号。
一些发行版似乎提供了内核debugging符号作为一个单独的包,这将取代上述命令中的vmlinux
文件。
Unix套接字通常是成对分配的,通常是连续的。 所以这对你可能会是1013410 +/- 1。 看看其中哪一个存在,并猜测罪魁祸首。
其实,从iproute2
(更换netstat,ifconfig等) ss
可以显示此信息。
以下是一个显示ssh
进程连接的ssh-agent unix域套接字的例子:
$ sudo ss -a --unix -p Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026 * 651642 users:(("ssh-agent",pid=27403,fd=4) u_str ESTAB 0 0 * 651642 * 651026 users:(("ssh",pid=2019,fd=4))
我写了一个工具 ,使用MvG的gdb方法来可靠地获取套接字对等信息,不需要内核debugging符号。
要使进程连接到给定的套接字,请将inode号传递给它:
# socket_peer 1013410 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
如果你需要输出,很容易parsing。
有关详细信息,请参阅https://github.com/lemonsqueeze/unix_sockets_peers 。
有关信息, inode + 1 / -1 hack是不可靠的。 它大部分时间都有效,但如果运气不好,会失败或(更糟糕)返回错误的套接字。
在这个文件中,你可以添加更多的东西进行debugging。
文件位置: /etc/dbus-1/system.conf
出于debugging的目的,你可以编辑你的system.conf来允许窃听:
用以下方式replace政策部分:
<policy context="default">
<!-- Allow everything to be sent -->
<allow send_destination="*" eavesdrop="true"/>
<!-- Allow everything to be received -->
<allow eavesdrop="true"/>
<!-- Allow anyone to own anything -->
<allow own="*"/>
<!-- XXX: Allow all users to connect -->
<allow user="*"/> </policy>
删除includedir行:system.d
<includedir>system.d</includedir>
资料来源: http : //old.nabble.com/dbus-send-error-td29893862.html
找出总线上发生的事情的最简单的方法是运行dbus-monitor
总线程序包附带的dbus-monitor
程序
您也可以尝试使用dbus-cleanup-sockets
来清理剩余的插槽。
以下命令将根据netstat
输出显示连接了多less次到dbus套接字的进程:
sudo netstat -nap | grep dbus | grep CONNECTED | awk '{print $8}' | sort | uniq -c
(在Ubuntu上testing)
硬核方式:这个命令将手动find/ proc和show中使用最多连接(所有types的套接字)的进程:
ls -lR */fd/* | grep socket | sed -r "s@([0-9{1}]+)/fd/@_\1_@g" | awk -F_ '{print $2}' | uniq -c | sort -n | awk '{print $1" "$2; print system("ps "$2"|tail -n1")}'
示例输出:
(计数,PID和下一行包含有关进程的详细信息)
25 3732 3732 ? Ss 0:38 /usr/bin/wineserver 89 1970 1970 ? Ss 0:02 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
(在Ubuntu上testing)
玩的开心。
参见相关文章以供参考: