如何知道某个PID监听了哪些端口?

如何知道某个PID监听了哪些端口?

我有一个特定进程的 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)。

解释:

  1. -p指定PID号;
  2. -i仅显示网络设备;
  3. -a对上述两个条件进行 AND(否则将进行 OR 运算);
  4. -P显示端口号(默认情况下显示端口名称)。

此外,可以相应地使用lsof -aPi4 -p 555lsof -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/.*://’

更多细节

相关内容