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

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

有时,在崩溃或bug之后,我的Rails应用程序正在锁定端口3000。我无法使用ps -ef找到它…

跑步时

rails server

我得到

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

停止Node.js进程时也会发生同样的问题。即使进程停止并且应用程序停止运行,端口3000也会被锁定。再次启动应用程序时,获取

Address already in use (Errno::EADDRINUSE)
3241435 次浏览

您可以使用lsof -i:3000

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

  1. 你可以试试netstat

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

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

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

以上没有什么对我有用。任何有我经验的人都可以尝试以下方法(为我工作):

运行:

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

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

ps ax | grep <PID>

最后,“和它一起走”:

kill -QUIT <PID>

在您的.bash_profile中,为terminate 3000进程创建一个快捷方式:

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

然后,调用$terminate如果它被阻止。

查找:

sudo lsof -i :3000

击杀:

kill -9 <PID>

请注意:-9立即终止进程,并且没有给它清理自己的机会。这可能会导致问题。考虑使用-15(TERM)或-3(QUIT)作为更软的终止,允许进程自行清理。

在端口上杀死进程的方法之一是使用python库:freeport(https://pypi.python.org/pypi/freeport/0.1.9)。安装后,只需:

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

在OS-X El船长上的命令行中执行:

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

lsof的简明选项仅返回PID。

找到开放的连接

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

按进程ID杀死

Kile-9'PID'

使用端口3000提取进程的PID并杀死它的单行程序。

lsof -ti:3000 | xargs kill

t标志从lsof输出中删除除PID之外的所有内容,从而可以轻松杀死它。

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

顶部

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

ps

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

ps -A

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

ps -A | grep firefox

将信号传递给程序的最常见方式是使用mi命令。

kill PID_of_target_process

lsof

所有打开的文件和打开它们的进程的列表。

lsof -i -P | grep -i "listen"kill -9 PID

 lsof -i tcp:3000

您应该使用终端尝试此代码:

$ killall -9 ruby

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

lsof -n -i4TCP:3000
OR lsof -i:3000

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

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

kill -9 "PID"

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

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

为什么kill -9 PID不起作用?如果你试图用它的PID杀死一个进程,它仍然在另一个PID上运行,看起来你已经在不同的帐户中启动了这个进程,很可能是根帐户。

添加到~/.bash_profile

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

source ~/.bash_profile然后运行

killTcpListen 8080

使用辛达雷胡斯fmi工具,您可以这样做:

$ fkill :3000

太长别读:

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

如果您处于同时有客户端和服务器使用端口的情况,例如:

$ lsof -i tcp:3000COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAMEnode       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

我为此做了一个小功能,将其添加到您的rc文件(.bashrc.zshrc或其他)

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

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

如果做不到这一点,你总是可以从rails根目录中键入kill -9 $(cat tmp/pids/server.pid)

这个命令行很容易记住:

npx kill-port 3000

您还可以一次杀死多个端口:

npx kill-port 3000 3001 3002

对于一个更强大的搜索工具:

npx fkill-cli


PS:他们使用第三方JavaScript包。npx内置Node.js.

来源:推特|github

你应该试试这个,这个技术是操作系统独立的。

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

我认为这是最简单的方法。

找到并杀死:

这个命令行很简单,工作正常。

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

这是一个辅助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

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

要查看阻塞端口的进程:

netstat -vanp tcp | grep 3000

要杀死阻塞端口的进程:

kill $(lsof -t -i :3000)

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

快速和简单的解决方案

kill -9 $(lsof -ti:3000)

对于多个端口:

kill -9 $(lsof -ti:3000,3001)

#3000是要释放的端口

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

kill -9 $(lsof -ti:3000,3001)

#这里多个端口3000和3001是要释放的端口

lsof-ti: 3000

如果端口被占用,上述命令将返回如下内容:82500(进程ID)

lsof-ti: 3001

82499

lsof-ti: 3001,3000

8249982500

k-9$(lsof-ti: 3001,3000)

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

对于在package.json脚本中使用它:

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

在终端中,您可以使用:

npm run start

在mac os

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

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

kill -9 PID-将杀死进程

在你的情况下,它将是

lsof -i tcp:3000从您的终端查找进程的PID

kill -9 PID

你可以试试这个

netstat -vanp tcp | grep 3000

这两个命令将帮助您找到并杀死服务器进程

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

我用这个:

cat tmp/pids/server.pid | pbcopy

然后kill -9 'paste'

杀死多个端口。

$ npx kill-port 3000 8080 8081
Process on port 3000 killedProcess on port 8080 killedProcess on port 8081 killed

希望这个帮助!

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

killall -9 node

我使用:

lsof -wni tcp:3000

获取PID,然后:

kill -9 <PID>

我最喜欢的一行:

kill -9 $(lsof -ti:3000)

我总是在macOS上工作。

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

"scripts": {..."killme": "kill -9 $(lsof -ti:3000)",...},

然后

npm run killme

--

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

导航到您的主目录:

cd ~

打开。bash_profile或zsh配置文件使用nm或vim:

vi .bash_profile

添加别名(按i):

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

保存文件

重启终端

输入killme到终端

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

如果您使用的是Zsh,并且不想记住多管道命令,只需将下一行代码添加到~/.zshrc

function murder() {lsof -nti:$1 | xargs kill -9}

然后,每当您需要在特定端口上终止进程时,只需使用:

murder 3000

P. S随意重命名命令并改进它:)

用终端o/p解释步骤

我有Macbook Pro(Catalina),有一天我在运行Django服务器(默认情况下在8000端口上运行)时发现了以下问题:

pythonmanage.pyrunserver 3000

(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ python manage.py runserver 3000Watching for file changes with StatReloaderPerforming system checks...
System check identified no issues (0 silenced).July 27, 2021 - 23:54:05Django version 3.2.3, using settings 'automated_classification.settings'Starting development server at http://127.0.0.1:3000/Quit the server with CONTROL-C.Error: That port is already in use.

我尝试使用提供并执行,但只运行其中一个并不能解决我的问题(我知道还有其他一些答案,但不知何故我解决了我的问题)。例如。我试图重新运行上述命令,但也不起作用(进程仍然处于活动状态)。

所以我最后按照他和其他人的建议使用了@Cris的回答,增加了1个额外的步骤。所以我的答案只是使用他们的命令和终端输出,让你更清楚地执行。

lsof-P|grep': 3000'|awk'{print 2美元}'

(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ lsof -P | grep ':3000' | awk '{print $2}'3623938272

现在我得到了要杀死的ID列表,让我们做。

k-9

(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 36239(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 36239-bash: kill: (36239) - No such process(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 38272(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 38272-bash: kill: (38272) - No such process

现在,让我们尝试重新运行该命令。

pythonmanage.pyrunserver 3000

(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ python manage.py runserver 3000Watching for file changes with StatReloaderPerforming system checks...
System check identified no issues (0 silenced).July 27, 2021 - 23:55:53Django version 3.2.3, using settings 'project.settings'Starting development server at http://127.0.0.1:3000/Quit the server with CONTROL-C.

最终版本

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

您可以将上述2个步骤组合在1行&执行以杀死端口3000上的进程监听。

在终端上写

sudo kill -9 $(lsof -i :3000 -t)

霍普,是工作。

在执行mi命令后,可能需要删除pid文件:

rm ~/mypath/myrailsapp/tmp/pids/server.pid