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


当前回答

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

类型:

netstat -anv | grep [.]PORT

输出将如下所示:

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

PID是最后一列之前的数字,在本例中为3105

其他回答

在macOS Big Sur和更高版本上,使用以下命令:

sudo lsof -i -P | grep LISTEN | grep :$PORT

或者只看到IPv4:

sudo lsof -nP -i4TCP:$PORT | grep LISTEN

对于旧版本,请使用以下表单之一:

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

用端口号或逗号分隔的端口号列表替换$PORT。

如果需要有关#1024以下端口的信息,请在sudo前面加上空格。

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

-P标志用于显示原始端口号,而不是解析名称(如http、ftp)或更深奥的服务名称(如dpserve、socalia)。

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

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

要终止PID:

sudo kill -9 <PID>
# kill -9 60401

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

类型:

netstat -anv | grep [.]PORT

输出将如下所示:

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

PID是最后一列之前的数字,在本例中为3105

在雪豹(OS X 10.6.8)上,运行“man lsof”可获得:

lsof -i 4 -a

(实际手动输入为“lsof-i 4-a-p 1234”)

之前的答案在雪豹上不起作用,但我一直在尝试使用“netstat-nlp”,直到我看到pts在答案中使用了“lsof”。

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

快速说明:

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

要终止PID:

kill -9 <PID>
# kill -9 60401

或作为一个衬垫:

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

您还可以使用:

sudo lsof -i -n -P | grep TCP

这在小牛队奏效。