在Mac上查找(并杀死)进程锁定端口3000


1807

如何找到(并杀死)侦听/使用我的TCP端口的进程?我在Mac OS X上。

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

做的时候

rails server

我懂了

地址已在使用中-bind(2)(Errno :: EADDRINUSE)

2014年更新:

要完成以下一些答案:在执行kill命令之后,可能需要删除pid文件。 rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
可以在下面的@Kevin Suttle答案中找到一种非常简洁的解决方案,它可以杀死任何用户指定端口上的进程。为后代而转载于此:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584 2014年

4
Port 3000不是“高度依赖开发”的-流星本机也可以在3000上运行,我敢肯定还有其他功能。
gregorvand 2015年

@ user456584在上面的评论应该是可接受的答案^^^该功能可以杀死我在端口上运行的许多进程
Aneuway

Answers:


3018
  1. 你可以试试 netstat

    netstat -vanp tcp | grep 3000
    
  2. 对于macOS El Capitan和更高版本(或者如果您的netstat不支持-p),请使用lsof

    sudo lsof -i tcp:3000 
    
  3. 对于Centos 7使用

    netstat -vanp --tcp | grep 3000
    

22
谢谢!您的回答催生了我的“ death_to'port'”脚本。(#!/ usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill
2013年

190
lsof的“ terse”标志产生的输出适合用于随后的杀死:lsof -t -i tcp:1234 | xargs kill
Manav 2014年

5
我已将其输入~/.bash_profile::findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill现在,我只需要输入killport 8080
AlfonsoPérez2015年

3
另一个提示:sudo如果看不到任何输出,请务必在lsof之前尝试
Abe Petrillo

4
另一个技巧是添加-Plsof命令,以便在输出中可见原始端口:lsof -P -i:3000
Jason Axelson

1873

找:

sudo lsof -i :3000

杀:

kill -9 <PID>

61
有时lsof -i:port不会显示任何内容。尝试sudo lsof -i:port
kilik52

31
为了安全起见,建议尝试kill -15 <PID>之前-9
Jamon Holmgren 2015年

7
@Jamon Holmgren为什么?两者都做什么?为什么kill <PID>不足够/危险/不完整?
Michael Trouw,2015年

13
@MichaelTrouw差不多一年后了,但这是您的答案。:-) unix.stackexchange.com/a/8918 TL; DR kill -15使该过程有机会自行清理。
Jamon Holmgren

9
我认为这个答案应该说明是什么-9
约瑟夫·弗雷利

206

以上对我没有任何帮助。有我经验的任何人都可以尝试以下操作(为我工作):

跑:

lsof -i :3000 (where 3000 is your current port in use)

然后检查报告的PID的状态:

ps ax | grep <PID>

最后,“随它去”:

kill -QUIT <PID>

18
实际上,这似乎比Filip Spiridonov稍后给出的答案更好,后者对您的9有277票赞成。您的答案早于6个月,并且具有相同的信息并有更多解释。没有正义……
Floris 2015年

尝试kill -TERM(或只是kill)之前kill -QUIT。并非每个进程都会在SIGQUIT上有序关闭。
craig65535

159

单线使用端口3000提取进程的PID并终止它。

lsof -ti:3000 | xargs kill

-t标志从lsof输出中除去PID以外的所有内容,从而很容易杀死它。


13
您可以使用以下方法过滤掉“监听”端口:lsof -ti:3000 -sTCP:LISTEN
Zlemini

1
这种方法最适合我。简单的一根衬板即可清除繁忙的端口。谢谢!
Ryan Trainor

137

最简单的解决方案

对于单端口:

kill $(lsof -ti:3000)  #3000 is the port to be freed

使用单行命令杀死多个端口:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti:3000

82500(进程ID / PID)

lsof -ti:3001

82499

lsof -ti:3001,3000

82499 82500

杀死$(lsof -ti:3001,3000)

在单个命令中终止82499和82500进程。

package.json脚本中使用此命令:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
这对我
有用

2
很高兴它有所帮助。
Abhijith Sasikumar,

113

单个命令行很容易记住:

npx kill-port 3000

有关搜索的更强大工具:

npx fkill-cli


PS:他们使用第三方javascript程序包。npx随Node.js内置。

资料来源: tweet | 的github


您可以分享使用brew安装npx的详细信息吗?我尝试将其安装在Mac High Sierra 10.13.3上,但无法正常工作。
realPK

@realPK npx带有npm附带node.js,所以它不是一个分隔的包。只需升级您的node.js和您的npm版本。
布鲁诺·莱莫斯

我主要使用Java,还没有接触过Node。我发现了一种杀死端口上运行的服务的不同方法。TY的回应。
realPK

5
需要NodeJS和JavaScript,以杀死运行在端口3000上的某些东西,可能对我来说太过头了。在您的.bashrc或.zshrc中添加简单的行(使用别名)即可解决此问题,而无需互联网。别名kill3000 ='lsof -ti:3000 | xargs kill”,那么您可以执行以下操作:kill3000
Khalil Gharbaoui

此问题的最佳解决方案..谢谢
King Rayhan

107

您可以使用lsof -i:3000

那就是“列出打开的文件”。这为您提供了进程列表以及它们使用哪些文件和端口。


我正在使用10.5 lepard(更新为Q)。我不知道这是否重要,但是lsof不会显示端口。lsof -h(lsof 4.78)太神秘了……
oma

1
嗯 不确定是否对Leopard感兴趣,但是请尝试(以root身份运行 -我认为这很重要)lsof -i:3000
马特·吉布森

59

在中.bash_profile,为terminate3000流程创建一个快捷方式:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

然后,$terminate如果被阻止,请致电。


12
您可以为任何端口提供足够的灵活性:github.com/kevinSuttle/dotfiles/commit/…–
Kevin Suttle

这样的描述性名称= p
Michael Peterson

我有类似的东西,但是我通过了港口。我将函数KP命名为kill port。
约瑟夫·钱伯斯'18

58

要强制终止此类进程,请使用以下命令

lsof -n -i4TCP:3000 

其中3000是该进程运行的端口号

这将返回进程ID(PID)并运行

kill -9 "PID"

将PID替换为运行第一个命令后获得的数字

对于实例,如果我想杀死在端口8080上运行的进程


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

这只会给您在MacOS上测试过的pid。


10
在MAC上杀死端口3000上的所有PID:lsof -P | grep':3000'| awk'{print $ 2}'| xargs杀死-9
迈克·克拉格

1
一个以上的进程可以监听同一端口吗?
克里斯(Kris)

我们的rails应用程序产生了属于子进程的工人,我必须使用它杀死孤儿
迈克·克拉格

2
这也会杀死连接到端口的网络浏览器
fjsj 2015年

5
这是工作区之一:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
鲍勃

29

在OS-X El Captain的命令行中执行:

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

lsof的Terse选项仅返回PID。


28

杀死端口上的进程的一种方法是使用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
到目前为止,这还不是最简单的方法。推荐的回复不需要您下载和安装任何东西。
格雷格·帕斯夸里洛

4
当满足先决条件时,这是如此简单和容易记住。我们对“最简单”有不同的定义,此答案完全正确且适当。也许只是缺少使用pip安装freeport的说明。
西里尔·杜尚·多丽丝

在幕后,freeport只是一个调用lsof -t -i:3000.. 的包装,似乎没有必要。
科里·戈德堡

这个解决方案不是最简单的,但它符合OP要求的100%...因此它确实符合有效的AF
danielrvt

26

要查看阻塞端口的进程:

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出现错误。
亨利

太奇怪了,我有两台Mac(均为High Sierra tho),我记得在它们两个上都运行了这些命令(旧习惯),而且我确定它们不会运行。我刚刚在我的机器上再次尝试过,知道该端口已被占用,同样的错误。:/
Milan Velebit

在运行时netstat -vanp tcp | grep 3000,您是否为被占用的端口获得了有效的PID ?
亨利

1
我试图在两者bashzsh外壳。对我来说很好。不知道为什么它不适合您。High Sierra可能对您有所帮助?我不知道:/
亨利



14

实现此目的的可能方法:

最佳

top命令是查看系统资源使用情况并查看占用最多系统资源的进程的传统方式。“顶部”显示进程列表,其中使用CPU最多的进程位于顶部。

ps

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

ps -A

您也可以通过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 

10

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

kill -9 PID -将杀死进程

在你的情况下,它将是

lsof -i tcp:3000 从您的终端中找到过程的PID

kill -9 PID



5

添加到~/.bash_profile

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

然后source ~/.bash_profile运行

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

如果您同时在使用该端口的客户端和服务器,例如:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

那么您可能不想杀死两者。

在这种情况下,您可以-sTCP:LISTEN用来仅显示正在侦听的进程的pid。将此与-t简洁的格式结合使用,您可以自动终止进程:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

我给这个一点点功能,将它添加到您的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
}

那么您只需键入kill-by-port 3000以杀死您的Rails服务器(用3000替换它正在运行的任何端口)

否则,您总是可以kill -9 $(cat tmp/pids/server.pid)从rails根目录中键入


我必须反斜杠\$PORT以使消息正确显示。否则,效果很好!
阿什伍德(Ashwood),

4

杀死多个端口。

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

希望有帮助!


1

您应该尝试此方法,该技术与操作系统无关。

在应用程序的侧面,有一个名为tmp的文件夹,在里面有另一个名为pids的文件夹。该文件包含服务器pid文件。只需删除该文件。端口会自动杀死自己。

我认为这是简单的方法。


1

这是一个帮助bash函数,用于按名称或端口杀死多个进程

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

用法:

$ fkill [process name] [process port]

例:

$ fkill someapp :8080 node :3333 :9000


0

如果您想要一种免代码的方式-打开活动管理器并强制杀死节点:)



-1

步骤1:查找正在运行的服务器: ps aux | grep puma 步骤2:杀死那些服务器杀死-9 [服务器号]


-1

在Mac OS中

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
这是5年前发布的评论,并且多次发布了模拟答案。
吉尔斯·古艾拉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.