题 谁正在侦听Mac OS X上的给定TCP端口?


在Linux上,我可以使用 netstat -pntl | grep $PORT 要么 fuser -n tcp $PORT 找出哪个进程(PID)正在侦听指定的TCP端口。如何在Mac OS X上获得相同的信息?


933
2017-12-12 12:30


起源


netstat -p tcp | grep $PORT。我认为这不是主题。 - khachik
抱歉, netstat -p tcp | grep $PORT 不显示PID,因为Mac OS X上的netstat无法显示PID。 - pts
netstat -anv 显示Mac OS X上的端口(来源:@SeanHamiliton下面的解决方案) - Curtis Yallop


答案:


在macOS High Sierra上,使用以下命令:

lsof -nP -i4TCP:$PORT | grep LISTEN

在旧版本上,使用以下形式之一:

lsof -nP -iTCP:$PORT | grep LISTEN
lsof -nP -i:$PORT | grep LISTEN

替代 $PORT 使用端口号或以逗号分隔的端口号列表。

前置 sudo (如果您需要有关#1024以下端口的信息,请使用空格)。

-n flag用于显示IP地址而不是主机名。这使得命令执行得更快,因为获取主机名的DNS查找可能很慢(对于许多主机来说,几秒或一分钟)。

-P flag用于显示原始端口号而不是已解析的名称 httpftp 或更多深奥的服务名称 dpservesocalia

有关更多选项,请参阅注释。


1434
2017-12-12 12:39



用此前缀 sudo 查看您不拥有的流程。 - Gordon Davisson
在狮子上,与变化一起工作 sudo lsof -i TCP:$PORT | grep LISTEN - dhaval
在Mountain Lion,你不需要 grep: sudo lsof -iTCP:$PORT -sTCP:LISTEN - Siu Ching Pong -Asuka Kenji-
经过这么多搜索,这一次是最好的。直接想要复制命令的人应该用实际端口号替换$ PORT或者为多个端口定义变量PORT,例如:export PORT = 8080,4433; lsof -n -i4TCP:$ PORT - siddhusingh
在我的 OSX 10.9.2 它甚至没有前面的运行 sudo。可以尝试一下,因为它使您无需输入密码即可运行它。 :) - Tom Fink


您还可以使用:

sudo lsof -i -n -P | grep TCP

这适用于小牛队。


374
2018-01-22 22:13



这为我做了工作,干杯(OS X 10.9) - James Cushing
也适用于约塞米蒂(10.10) - Galuga
该 -i 选项使它明显更快。 0.02秒vs 2秒。在我的应用程序中,这完全不同。 - Eric Boehs
这在Yosemite 10.10.2上对我有用 - Moeen M
大!与El Capitan一起工​​作...... - doncadavona


自优胜美地(10.10), 高山脉(10.13),每个版本的macOS都支持这个:

sudo lsof -iTCP -sTCP:LISTEN -n -P

341
2018-05-04 12:11



它至少和Snow Leopard一样古老。 - Yongwei Wu


2016年1月更新

真的很惊讶没有人建议:

lsof -i :PORT_NUMBER

获得所需的基本信息。例如,检查端口1337:

lsof -i :1337

其他变化,取决于具体情况:

sudo lsof -i :1337
lsof -i tcp:1337

您可以轻松地在此基础上提取PID本身。例如:

lsof -t -i :1337

这也与此命令等效(结果):

lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID

快速插图:

enter image description here

为了完整性,因为经常一起使用:

杀死PID:

kill -9 <PID>
# kill -9 60401

或作为一个班轮:

kill -9 $(lsof -t -i :1337)

226
2018-01-07 15:45



此命令还显示非侦听器PID,并且仅显式询问侦听器。 - pts
你也可以跑 lsof -t -i :1338。 -t 将返回进程ID,因此您不必awk / head。 - KFunk
@KFunk - 更新了,谢谢。 - arcseldon
什么都没有用,除了 kill -9 $(lsof -t -i :5000) 在capitan上 - goksel
这很棒。在我杀了它之前我更喜欢知道它是什么,所以(基于此)我刚刚添加到我的bashrc: whatsonport() { ps -ef | grep `lsof -t -i :$1` },所以: ⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node . - Sigfried


这适用于Mavericks(OSX 10.9.2)。

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN

79
2018-05-12 03:33



10.10我不需要sudo。 - Sophistifunk
也适用于Fedora 12。 - Meetai.com
工作优胜美地(10.10.2) - Phillip Kamikaze


在OS X上,您可以使用netstat的-v选项来提供关联的pid。

类型:

netstat -anv | grep [.]PORT

输出将如下所示:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0

PID是最后一列之前的数字,对于这种情况是3105


25
2017-11-03 08:06



你还需要添加 grep LISTEN 仅向听众展示。 - pts
这就是我需要的! lsof 找不到港口。但 netstat 显示它是开放的。 -v 是我缺少的秘诀。 - Aaron McMillin


在macOS上,这是一种简单的方法来获取正在侦听特定端口的进程ID netstat的。此示例查找在端口80上提供内容的进程:

找到在端口80上运行的服务器

netstat -anv | egrep -w [.]80.*LISTEN

样本输出

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0

最后一列的第二个是PID。在上面,它是 715

选项

-a  - 显示所有端口,包括服务器使用的端口

-n  - 显示数字,不要查找名称。这使命令成为一个 批量 更快

-v  - 详细输出,以获取进程ID

-w  - 搜索单词。否则命令将返回端口8000和8001的信息,而不仅仅是“80”

LISTEN  - 仅为LISTEN模式下的端口提供信息,即服务器


20
2018-01-14 22:14



-v标志成功了 - xyz