在Mac上查找(并终止)锁定端口3000的进程

2951

如何查找(并终止)监听/使用我的TCP端口的进程?我在macOS上。

有时,在崩溃或某些错误之后,我的Rails应用程序会锁定端口3000。我无法使用 ps -ef 找到它...

运行时

rails server

我得到了

Address already in use - bind(2) (Errno::EADDRINUSE)

当停止Node.js进程时,会出现相同的问题。即使进程已经停止并且应用程序停止运行,端口3000仍然被锁定。再次启动应用程序时,会得到以下提示:
Address already in use (Errno::EADDRINUSE)

42
下面是@Kevin Suttle在下面的回答中提供的一种非常简洁的解决方案,可以用来终止任何用户指定端口上的进程。此处为了保存记录而复制:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 } - user456584
@user456584 上面的评论应该被接受为答案 ^^^ 那个函数可以用来终止我在一个端口上运行的_许多_进程。 - Andrew Bowman
通过使用netstat查找进程并使用kill -9命令终止进程后,程序可以正常工作! - Gaurav
19
@richardec 的命令 kill -9 $(lsof -ti:3000) 无效吗? - Abhijith Sasikumar
这显然是一个非常具体的编程问题,很多人都会经常在谷歌上搜索。我需要找出在某个端口上运行的是什么,以便重新启动我的网络应用程序。我不认为它应该被关闭。请投票重新开放。 - superluminary
显示剩余3条评论
40个回答

50
lsof -P | grep ':3000' | awk '{print $2}'

这将为您提供仅 pid,已在 macOS 上进行测试。


13
在 MAC 上关闭所有在3000端口运行的进程: lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 - mike clagg
1
一个端口可以被多个进程同时监听吗? - Kris
我们的Rails应用程序会生成子进程工作器,我必须使用它来杀死孤立的工作器。 - mike clagg
2
这也会导致连接到端口的网络浏览器崩溃。 - fjsj
6
这是一个可用的命令:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9 - bob

40

在OS-X El Captain上通过命令行执行:

kill -kill `lsof -t -i tcp:3000`

lsof的简洁选项仅返回进程ID。


33

杀死端口上的进程的一种方法是使用Python库:freeport (https://pypi.python.org/pypi/freeport/0.1.9)。安装后,只需执行以下操作:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
远非最简单的方式。点赞的回复不需要您下载和安装任何东西。 - Greg Pasquariello
4
当前条件满足时,这个东西非常简单易记。我们对“最简单”的定义有所不同,而这个答案完全合理和适当。也许只是缺少使用pip安装freeport的说明。 - Cyril Duchon-Doris
在幕后,Freeport 只是一个调用 lsof -t -i:3000 的包装器.. 似乎有些不必要。 - Corey Goldberg
1
这个解决方案并不是最简单的,但它完全符合OP所要求的... 因此它确实是有效的AF。 - danielrvt

32

查看阻塞端口的进程:

netstat -vanp tcp | grep 3000

终止阻塞端口的进程:

kill $(lsof -t -i :3000)


这个在 Mac 机器上不起作用,会返回以下内容: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 但是,在大多数 Linux 发行版中它可以正常工作。 - Milan Velebit
1
@MilanVelebit 实际上在我的 Mac 机器(Sierra)上它完美地工作。如果你的端口 3000 被占用,那么它就可以正常工作。但是,如果没有进程阻塞该端口,则会出现 kill: not enough arguments 错误。 - Henry
这很奇怪,我有两台Mac(都是High Sierra),我记得在它们两台上运行这些命令(老习惯了),我确定它们不会运行。我刚刚在我的机器上再次尝试了一下,知道端口被占用,结果还是同样的错误。 :/ - Milan Velebit
在运行 netstat -vanp tcp | grep 3000 命令时,你是否得到了一个有效的 PID,以确定占用了你的端口? - Henry
我运行了lsof -i:端口号命令,并返回了该进程。 netstat 命令也是同样的结果,两者都正确输出占用该端口的进程信息。 - Milan Velebit
1
我在bashzsh shell中都试过了。对我来说运行得很好。不确定为什么你的不起作用。可能与High Sierra有关?我不知道:/ - Henry

27

寻找并杀死:

这个单行命令简单易用且功能正确。

kill -9 $(lsof -ti tcp:3000)

26

查找开放连接

使用 lsof -i -P | grep -i "listen" 命令。

通过进程 ID 杀死进程

使用 kill -9 'PID' 命令。


18

实现这个的可能方法:

top

top命令是查看系统资源使用情况和查看占用最多系统资源进程的传统方法。Top显示进程列表,使用CPU最多的在顶部。

ps

ps命令列出正在运行的进程。下面的命令列出系统上所有正在运行的进程:

ps -A
您还可以将输出通过grep管道进行过滤,以查找特定进程而不使用其他命令。以下命令将搜索Firefox进程:
您可以使用grep过滤特定的进程,而无需使用其他命令。下面的命令将搜索Firefox进程:
ps -A | grep firefox

向程序传输信号最常用的方式是使用kill命令。

kill PID_of_target_process

lsof

列出所有打开的文件及它们被哪些进程打开。

lsof -i -P | grep -i "listen"
kill -9 PID
或者
 lsof -i tcp:3000 

13

lsof -i tcp:port_number - 会列出运行在该端口上的进程

kill -9 PID - 会杀死该进程

针对您的情况,可以在终端中输入 lsof -i tcp:3000 查找进程的PID

然后使用kill -9 PID命令杀死该进程。


12

我为此写了一个小函数,将其添加到您的rc文件(.bashrc.zshrc或其他)中

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

如果您想关闭Rails服务器(将3000替换为它运行的端口),则只需键入kill-by-port 3000

如果无法这样做,您可以在Rails根目录中键入kill -9 $(cat tmp/pids/server.pid)


1
我不得不在\$PORT前加上反斜杠才能正确显示消息。否则,一切都很好! - rosalynnas

12

以下两个命令将帮助您寻找并结束服务器进程

  1. lsof -wni tcp:3000
  2. kill -9 pid

我的荣幸,Aashiah - Saif chaudhry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接