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


当前回答

这是macOS High Sierra的一个好方法:

netstat -an |grep -i listen

其他回答

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

lsof -i 4 -a

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

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

直到macOS 13 Ventura,每个版本的macOS都支持此功能:

sudo lsof-iTCP-sTCP:列表-n-P

就我个人而言,我在~/.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
}

然后,listing命令为您提供了一个在某个端口上侦听的进程列表,并为某个模式侦听smthgreps。

有了这一点,很容易询问特定的进程,例如监听dropbox或端口,例如监听22。

lsof命令有一些专门的选项来询问端口、协议、进程等,但就我个人而言,我发现上面的函数更方便,因为我不需要记住所有这些低级选项。lsof是一个非常强大的工具,但不幸的是使用起来不太舒服。

对MichałKalinowski的回答稍有改进(我没有足够的声誉在那里留下评论):如果您试图发现进程正在监听一个编号为255及以下的端口,grep命令可能会打印与IP地址相关的行,而这些行与期望的结果不符。对于任何编号的端口,grep命令也可能错误地匹配设备的MAC地址或PID。为了改进这一点,我建议将命令更改为grep--color“:$1”

在最新的macOS版本上,可以使用以下命令:

lsof -nP -i4TCP:$PORT | grep LISTEN

如果你觉得很难记住,那么也许你应该创建一个bash函数,并用一个更友好的名称来导出它

vi ~/.bash_profile

然后将以下行添加到该文件并保存。

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}

现在,您可以在终端中键入listening_on 80,并查看哪个进程正在侦听端口80。

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)