在Linux上,可以使用netstat -pntl | grep $PORT
或fuser -n tcp $PORT
命令来查找监听特定TCP端口的进程(PID)。在Mac OS X上如何获取相同的信息?
在 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
sudo
,可以查看你没有所有权的进程。 - Gordon Davissongrep
: sudo lsof -iTCP:$PORT -sTCP:LISTEN
命令可以实现相同的功能。 - Siu Ching Pong -Asuka Kenji-listening() {
if [ $# -eq 0 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P
elif [ $# -eq 1 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
else
echo "Usage: listening [pattern]"
fi
}
listening
命令会列出在某个端口上监听的进程,而listening smth
则会根据某个模式进行匹配。listening dropbox
,或者端口,比如listening 22
。
lsof
命令有一些专门的选项,可以询问端口、协议、进程等等,但个人觉得上述功能更方便,因为不需要记住所有这些底层选项。 lsof
是一个非常强大的工具,但可惜的是使用起来不太方便。-pntl
,这将列出所有服务。而被接受的答案要求指定一个或多个端口号,这显然不是同一回事。 - seeafish~/.zshrc
文件以使其与 MacOS 的默认终端兼容。 - roganjosh你也可以使用:
sudo lsof -i -n -P | grep TCP
这在Mavericks系统上可以使用。
man lsof
获取更多信息。 - dsas2016年1月更新
真的很惊讶没有人提出:
lsof -i :PORT_NUMBER
获取所需的基本信息。例如,检查端口1337:
lsof -i :1337
根据不同情况,可能会有其他变化:
sudo lsof -i :1337
lsof -i tcp:1337
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)
lsof -t -i :1338
命令。 -t
选项将返回进程 ID,因此您无需使用 awk/head 命令。 - KFunkkill -9 $(lsof -t -i :5000)
之外,没有任何其他方法可行。 - gokselwhatsonport() { ps -ef | grep \
lsof -t -i :$1` }`,所以:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
- Sigfriedlsof -i :PORT_NUMBER
对我很有帮助。 - marika.daboja对于LISTEN、ESTABLISHED和CLOSED端口:
sudo lsof -n -i -P | grep TCP
sudo lsof -n -i -P | grep LISTEN
sudo lsof -n -i -P | grep ':80 (LISTEN)'
或者如果你只想要一个简洁的摘要[没有描述服务/应用程序],可以使用netstat
。这里的好处是,不需要sudo权限:
netstat -a -n | grep 'LISTEN '
lsof
选项(更多详情见man lsof
):
-n
抑制主机名-i
适用于IPv4和IPv6协议-P
省略端口名称netstat
选项(更多详情见man netstat
):
-a
所有套接字-n
不解析名称,以数字显示网络地址已在 High Sierra 10.13.3 和 Mojave 10.14.3 上进行测试
最后一个语法 netstat
在 Linux 上也有效 [apt 安装 net-tools]
lsof 在某些 Linux 分发版中默认存在
netstat -anv | grep [.]PORT
输出结果将看起来像这样:
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 3105 0
PID是最后一列之前的数字,在本例中为3105。
grep LISTEN
以仅显示监听者。 - ptslsof
找不到这个端口,但 netstat
显示它是开放的。 -v
是我所缺少的关键信息。 - Aaron McMillin在 macOS 上,使用 netstat 可以轻松获取监听特定端口的进程 ID。以下示例查找在端口 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模式下的端口(即服务器)的信息
在最新的macOS版本中,您可以使用这个命令:
lsof -nP -i4TCP:$PORT | grep LISTEN
如果你觉得难以记忆,也许你应该创建一个 bash
函数并将其导出为更友好的名称, 就像这样:vi ~/.bash_profile
然后将以下行添加到该文件中并保存。
function listening_on() {
lsof -nP -i4TCP:"$1" | grep LISTEN
}
现在你可以在终端中键入 listening_on 80
并查看哪个进程正在监听端口 80
。
在Snow Leopard(OS X 10.6.8)上运行“man lsof”会产生以下结果:
lsof -i 4 -a
(实际手动输入是'lsof -i 4 -a -p 1234')
之前的回答在Snow Leopard上不起作用,但我一直在尝试使用'netstat -nlp',直到看到pts的回答中使用了'lsof'。
我想分享这个命令,它可以很好地工作并打印标题,以便您知道哪一列是哪一个:
lsof -iTCP:8080 -sTCP:LISTEN -P -n
示例输出: {{link1:}}
netstat -anv
显示 Mac OS X 上的端口(来源:@SeanHamiliton 的下面解决方案)。 - Curtis Yallop