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

oma*_*oma 1595 macos process

如何查找侦听/使用我的tcp端口的进程?我在mac os x上.

有时,在崩溃或一些错误后,我的rails应用程序锁定端口3000.我找不到它使用ps -ef ...我怎么找到愚蠢的东西并杀死它,残忍......?

做的时候

rails server
Run Code Online (Sandbox Code Playgroud)

我明白了

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

2014年更新:

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

gho*_*g74 2641

  1. 你可以试试 netstat

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

    sudo lsof -i tcp:3000 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于Centos 7使用

    netstat -vanp --tcp | grep 3000
    
    Run Code Online (Sandbox Code Playgroud)

  • lsof的"简洁"标志产生的输出适合于随后的杀戮:`lsof -t -i tcp:1234 | xargs杀死` (166认同)
  • 谢谢!你的答案催生了我的"death_to'port'"脚本.(#!/ usr/bin/ruby​​`lsof -t -i tcp:#{ARGV.first} | xargs kill`) (12认同)
  • 这篇文章只是答案的一半 (9认同)
  • 另一个提示:如果你没有看到任何输出,请务必在lsof之前尝试`sudo` (3认同)
  • 另一个提示是将`-P`添加到`lsof`命令,以便原始端口在输出中可见:`lsof -P -i:3000` (3认同)
  • 我的 bashprofile 函数基于上述建议但进行了简化: `killport() { lsof -t -i tcp:$1 | lsof -t -i tcp:$1 | lsof -t -i tcp:$1 xargs Kill -9 }` 用法:`killport 5000` (3认同)
  • 我已经将它放入我的〜/ .bash_profile`中: findandkill`所以现在我只需要输入`killport 8080`即可节省几秒钟 (2认同)
  • Sudo ftw !! 在macos sierra上,没有sudo,我没有输出lsof (2认同)
  • 如果您使用的是 macOS Monterey,Airplay 服务器现在使用端口 5000,因此您需要更改进程的端口或在“系统偏好设置”>“共享”中终止 Airplay 接收器 (2认同)

Fil*_*nov 1662

找:

sudo lsof -i :3000
Run Code Online (Sandbox Code Playgroud)

杀:

kill -9 <PID>
Run Code Online (Sandbox Code Playgroud)

  • 有时**lsof -i:port**将不显示任何内容.试试**sudo lsof -i:port**. (59认同)
  • 为了安全起见,建议在使用`-9`之前尝试`kill -15 <PID>`. (19认同)
  • @MichaelTrouw差不多一年后,但这是你的回答.:-) http://unix.stackexchange.com/a/8918 TL; DR`kill -15`让这个过程有机会自行清理. (8认同)
  • @Jamon Holmgren为什么?两者都做什么?为什么```kill <PID>```不够/危险/不完整? (7认同)
  • 我认为这个答案应该说'-9`的作用. (4认同)
  • 请不要在不考虑两次的情况下使用`kill -9`,并先尝试其他信号.它会导致一个进程立即退出,不会自行清理,可能会留下一个烂摊子或使数据库处于不一致的状态...尝试一个TERM(默认为`kill`,不需要标记)或QUIT(`kill -3 pid`)至少是第一个,并在发送KILL之前检查你正在处理的进程. (4认同)
  • 由于[这个说唱视频],我从未忘记过这个命令。(https://www.youtube.com/watch?v=Fow7iUaKrq4) (3认同)
  • 我刚刚经历过这种清理对于 Java 进程很重要。用 -9 杀死后重新启动我的机器解决了问题。接下来将尝试-15。 (2认同)

Aus*_*tin 185

上面没有任何东西对我有效.有我经验的任何人都可以尝试以下(为我工作):

跑:

lsof -i :3000 (where 3000 is your current port in use)
Run Code Online (Sandbox Code Playgroud)

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

ps ax | grep <PID>
Run Code Online (Sandbox Code Playgroud)

最后,"用它来做":

kill -QUIT <PID>
Run Code Online (Sandbox Code Playgroud)

  • 这实际上似乎比Filip Spiridonov稍后提供的更好的答案,Filip Spiridonov有277票赞成你的9.你的是6个月之前,并且有相同的信息和更多的解释.没有正义...... (16认同)
  • 在“kill -QUIT”之前尝试“kill -TERM”(或只是“kill”)。并非每个进程都会在 SIGQUIT 上有序关闭。 (2认同)

Zle*_*ni 139

使用端口3000提取进程的PID并使其终止的单行程序.

lsof -ti:3000 | xargs kill
Run Code Online (Sandbox Code Playgroud)

-t标志从lsof输出中删除除PID之外的所有内容,从而可以轻松地将其删除.

  • 您可以使用以下命令过滤掉"监听"端口:`lsof -ti:3000 -sTCP:LISTEN` (12认同)
  • 这种方法最适合我。简单的一艘班轮可以清理繁忙的港口。谢谢! (2认同)

Der*_*ike 101

你可以用lsof -i:3000.

那就是"列出打开文件".这将为您提供进程列表以及它们使用的文件和端口.


Bru*_*mos 89

这个命令行很容易记住:

npx kill-port 3000

对于搜索功能更强大的工具:

npx fkill-cli


PS:他们使用第三方javascript包

来源: 推文 | github上

  • 需要 NodeJS 和 JavaScript,杀死在端口 3000 上运行的东西可能是 rails ......对我来说似乎开销太大。使用别名向您的 .bashrc 或 .zshrc 添加一条简单的行即可解决该问题,而无需互联网。别名 kill3000='lsof -ti:3000 | xargs kill' 那么你可以这样做:kill3000 (8认同)

Abh*_*mar 70

最简单的解决方案

对于单端口:

kill $(lsof -ti:3000)  #3000 is the port to be freed
Run Code Online (Sandbox Code Playgroud)

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

kill $(lsof -ti:3000,3001)  #3000 and 3001 are the ports to be freed
Run Code Online (Sandbox Code Playgroud)

lsof -ti:3000

82500(进程ID)

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" }

  • 这应该是最好的解决方案。是否可以通过一个简短的命令来查找并杀死:) (5认同)
  • 这确实很简单并且确实有效。十分感谢。 (4认同)
  • 很高兴有帮助。 (3认同)

ale*_*xzg 58

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

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

然后,$terminate如果它被阻止,请打电话.

  • 您可以为任何端口提供足够的灵活性:https://github.com/kevinSuttle/dotfiles/commit/9458141f40094d96952adc7c423cbdddeb909a81 (12认同)

Tad*_*egn 56

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

lsof -n -i4TCP:3000 
Run Code Online (Sandbox Code Playgroud)

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

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

kill -9 "PID"
Run Code Online (Sandbox Code Playgroud)

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

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


Bin*_* Ho 49

杀死多个端口。

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!


Kri*_*ris 36

lsof -P | grep ':3000' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

这将为您提供在MacOS上测试的pid.

  • 在MAC上杀死端口3000上的所有pid:lsof -P | grep':3000'| awk'{print $ 2}'| xargs kill -9 (8认同)
  • 这是一个工作:`lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep'LISTEN'| awk'{print $ 2}'| xargs kill -9` (5认同)
  • 这也会杀死连接到端口的网络浏览器 (2认同)

YBa*_*hia 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
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这不是最简单的方法.upvoted回复不要求您下载和安装任何东西. (7认同)
  • 满足先决条件时,这非常简单易记.我们对"最简单"有不同的定义,这个答案是完全有效和恰当的.也许它只是缺少用pip安装freeport的说明. (4认同)

JE4*_*E42 27

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

kill -kill `lsof -t -i tcp:3000`
Run Code Online (Sandbox Code Playgroud)

lsof的Terse选项只返回PID.


Hen*_*nry 26

要查看阻止端口的进程:

netstat -vanp tcp | grep 3000

要杀死阻塞端口的进程:

kill $(lsof -t -i :3000)


Sou*_*gat 24

找到开放的连接

lsof -i -P | grep -i"听"

杀死进程ID

杀死-9'PID'


Rah*_*arg 22

找到PID并终止进程.

lsof -ti:3000 | xargs kill
Run Code Online (Sandbox Code Playgroud)


小智 21

找到并杀死:

这个单一的命令行很简单,工作正常.

kill -9 $(lsof -ti tcp:3000)
Run Code Online (Sandbox Code Playgroud)


smo*_*oth 14

实现这一目标的可能方法:

最佳

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

PS

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

ps -A
Run Code Online (Sandbox Code Playgroud)

您还可以通过grep管道输出以搜索特定进程,而无需使用任何其他命令.以下命令将搜索Firefox进程:

ps -A | grep firefox
Run Code Online (Sandbox Code Playgroud)

将信号传递给程序的最常用方法是使用kill命令.

kill PID_of_target_process
Run Code Online (Sandbox Code Playgroud)

lsof的

所有打开文件的列表以及打开它们的进程.

lsof -i -P | grep -i "listen"
kill -9 PID
Run Code Online (Sandbox Code Playgroud)

要么

 lsof -i tcp:3000 
Run Code Online (Sandbox Code Playgroud)


Cal*_*ene 10

我为此做了一个小功能,将它添加到您的 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
}
Run Code Online (Sandbox Code Playgroud)

然后你可以输入kill-by-port 3000杀死你的 rails 服务器(用 3000 代替它运行的任何端口)

失败了,你总是可以kill -9 $(cat tmp/pids/server.pid)从 rails 根目录输入


Sha*_*han 9

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

kill -9 PID -将杀死进程

在你的情况下,它将是

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

kill -9 PID


小智 8

这两个命令将帮助您查找和终止服务器进程

  1. lsof -wni tcp:3000
  2. 杀死-9 pid


hak*_*iko 6

kill -9 $(lsof -ti:3000)
Run Code Online (Sandbox Code Playgroud)

始终在 macOS 上为我工作。

如果您正在处理 node.js 项目,则可以将其添加到 package.json 脚本中,例如;

"scripts": {
    ...
    "killme": "kill -9 $(lsof -ti:3000)",
    ...
  },
Run Code Online (Sandbox Code Playgroud)

然后

npm run killme
Run Code Online (Sandbox Code Playgroud)

——

此外,如果您想为 macOS 添加系统范围的别名,请按照以下步骤操作;

  1. 导航到您的主目录:

    光盘~

  2. 使用 nano 或 vim 打开 .bash_profile 或 zsh 配置文件:

    vi .bash_profile

  3. 添加别名(按 i):

    别名 killme="kill -9 $(lsof -ti:3000)"

  4. 保存存档

  5. 重启终端

输入killme终端

当然,您可以将端口 3000 更改为您想要的。


rof*_*rol 5

添加到~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
Run Code Online (Sandbox Code Playgroud)

然后source ~/.bash_profile

killTcpListen 8080


Kod*_*ham 5

使用sindresorhusfkill工具,你可以这样做:

$ fkill :3000
Run Code Online (Sandbox Code Playgroud)


Say*_*yka 5

适用于我终止节点(Mac OS Catalina)

killall -9 node
Run Code Online (Sandbox Code Playgroud)