我有一个特定进程的 PID,正在监听 OS X 上的某些端口,并且我需要知道该进程正在监听哪个端口。我该怎么做?
我知道我可以用来lsof
知道哪个进程正在侦听某个端口,但我需要执行逆操作。
谢谢。
UPD
OS X 使用 BSD utils,所以我有 BSDnetstat
而不是 Linux netstat
。 Linuxnetstat
可以-p
选择显示 PID,BSDnetstat
使用-p
指定端口并且没有显示 PID 的选项。
答案1
我通过深入阅读自己找到了解决方案man lsof
。 (是的,RT*M 仍然有帮助。)感谢@Gilles 的瞄准。
这是解决方案: lsof -aPi -p 555
(555是PID)。
解释:
-p
指定PID号;-i
仅显示网络设备;-a
对上述两个条件进行 AND(否则将进行 OR 运算);-P
显示端口号(默认情况下显示端口名称)。
此外,可以相应地使用lsof -aPi4 -p 555
或lsof -aPi6 -p 55
仅用于 IPv4 或 IP6 地址。
如果输出将由另一个程序解析-Fn
选项可能会有所帮助。使用此选项lsof
将产生“其他程序的输出”而不是良好的格式化输出。lsof -aPi4 -Fn -p 555
将输出类似这样的内容:
p554
nlocalhost:4321
聚苯乙烯 我已经在我的 OS X El Capitan 上测试了所有这些内容,但据我所知,它也应该可以在 Linux 上运行。
答案2
lsof
提供有关进程打开的文件的信息,包括网络端口。它几乎可以在所有 UNIX 系统上使用,包括操作系统。
这Unix 版罗塞塔石碑没有列出 OSX 上“将进程与文件或端口匹配”的任何其他工具。
要列出侦听 TCP 端口的进程,您可以使用
lsof -iTCP -sTCP:LISTEN
lsof -iUDP
列出打开 UDP 套接字的进程。lsof -i
列出所有打开的网络套接字(TCP 客户端、TCP 服务器和其他 IP 协议)。
答案3
如果你想知道哪个端口正在监听,你可以使用 netstat 的 -p 选项。你需要成为超级用户:
$ sudo netstat -nlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 125004/nginx
如果你想了解更多,试试这个关联
答案4
您可以将 netstat 与 grep、awk 和 sed 连接起来,以在 Linux 和 Cygwin 上显示端口及其相应的 pid:
$ netstat -ano | grep LISTENING | grep -v ‘\[::\]’ | sort -n | uniq -c | awk ‘ {print $3 “\t” $6}’ | sed ‘s/.*://’