在 Linux 上,我可以使用netstat -pntl | grep $PORT或fuser -n tcp $PORT找出哪个进程 (PID) 正在侦听指定的 TCP 端口。如何在 Mac OS X 上获得相同的信息?
netstat -pntl | grep $PORT
fuser -n tcp $PORT
在 macOSBig Sur及更高版本上,使用以下命令:
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为端口号或以逗号分隔的端口号列表。
$PORT
如果您需要关于 #1024 以下端口的信息,请在前面添加sudo(后跟空格)。
sudo
该-n标志用于显示 IP 地址而不是主机名。这使得命令执行得更快,因为获取主机名的 DNS 查找可能很慢(对于许多主机来说是几秒钟或一分钟)。
-n
该-P标志用于显示原始端口号,而不是像解析的名称http,ftp或更深奥的服务名称,如dpserve, socalia。
-P
http
ftp
dpserve
socalia
为了完整起见,因为经常一起使用:
要kill PID:
sudo kill -9 <PID> # kill -9 60401
直到macOS 12 Monterey,每个版本的 macOS 都支持:
sudo lsof -iTCP -sTCP:LISTEN -n -P
就我个人而言,我最终得到了这个简单的函数~/.bash_profile:
~/.bash_profile
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
listening smth
有了这个,就很容易询问特定的进程,例如listening dropbox,或端口,例如listening 22。
listening dropbox
listening 22
lsofcommand 有一些专门的选项来询问端口、协议、进程等,但我个人发现上面的函数更方便,因为我不需要记住所有这些低级选项。lsof是相当强大的工具,但不幸的是使用起来不太舒服。
lsof