如何查找创建特定Unix Socket的进程?
嘿,我来帮你搞定这个问题!首先得澄清一个点:通常来说,创建Unix Socket并对其进行监听的进程就是它的创建者——毕竟要先调用socket()创建套接字,再bind()到目标路径,最后listen()进入监听状态。不过如果你还是想确认,或者遇到了特殊场景,下面这些工具和命令可以帮你精准定位:
1. 用 lsof 精准筛选
你已经试过lsof -nl,那可以进一步指定socket路径来缩小范围:
lsof -Ua /run/user/1000/keyring-.../ssh
参数说明:
-U:只显示Unix Socket相关的条目-a:逻辑与,结合后面的路径筛选,只输出关联该socket路径的进程-nl:跳过用户名和主机名解析,速度更快,同时直接显示UID和PID
这个命令会列出所有打开该socket的进程,要是gnome-keyring是创建者,你会在COMMAND列看到它,TYPE列会显示STREAM或DGRAM,STATE列则会标注LISTEN(监听状态)。
2. 用 ss 替代netstat(更强大的工具)
netstat已经慢慢被ss取代了,它对Unix Socket的支持更完善。试试这条命令:
ss -xp | grep /run/user/1000/keyring-.../ssh
参数说明:
-x:专门显示Unix Socket-p:显示关联的进程信息(需要root权限,不然可能看不到完整内容)
输出里会直接给出PID和进程名,比如pid=1234(gnome-keyring-daemon),一眼就能看到哪个进程在操控这个socket。
3. 直接检查进程的文件描述符
如果上面的工具没给你足够信息,还可以直接查看gnome-keyring进程的文件描述符,确认它是否持有这个socket:
先拿pidof gnome-keyring-daemon获取它的PID(假设是1234),然后执行:
ls -l /proc/1234/fd | grep ssh
要是能看到指向/run/user/1000/keyring-.../ssh的链接(一般是type=STREAM),那就实锤这个进程打开了该socket,结合监听状态,基本就能确定它就是创建者了。
补个小知识点:为什么netstat没显示?
你说netstat -tulpen找不到这个socket,是因为-t是TCP、-u是UDP,Unix Socket得用-x参数:
netstat -xlpen | grep /run/user/1000/keyring-.../ssh
这样就能看到对应的条目啦。
内容的提问来源于stack exchange,提问作者Ojs

