在Mac上查找并终止监听3000端口的进程

在Mac上查找并终止监听3000端口的进程

技术背景

在Mac系统开发过程中,有时会遇到端口被占用的情况,例如3000端口,这会导致新的服务无法正常启动。因此,需要找到并终止占用该端口的进程。

实现步骤

查找占用端口的进程

  1. 使用lsof命令:对于macOS El Capitan及更高版本,或者netstat不支持-p选项时,可使用以下命令查找监听3000端口的进程:
1
lsof -i tcp:3000

或者

1
sudo lsof -i :3000

还可以使用更简洁的方式仅获取PID:

1
lsof -ti:3000
  1. 使用netstat命令
1
netstat -vanp tcp | grep 3000

终止进程

找到进程的PID(Process ID)后,使用kill命令终止进程:

1
kill -9 <PID>

注意-9选项会立即终止进程,不给进程清理自身资源的机会,可能会导致问题。建议使用-15(TERM)或-3(QUIT)进行软终止,让进程有机会清理自身资源。

快捷方式

可以使用以下单命令行快速终止监听3000端口的进程:

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

若要同时终止多个端口的进程,例如3000和3001端口:

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

package.json中使用

可以在package.jsonscripts部分添加命令,在启动服务前先终止占用端口的进程:

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

然后在终端中运行:

1
npm run start

使用第三方工具

  • npx kill-port:可以轻松终止单个或多个端口的进程。
1
npx kill-port 3000

同时终止多个端口:

1
npx kill-port 3000 3001 3002
  • npx fkill-cli:一个功能更强大的工具,支持搜索。
1
npx fkill-cli

核心代码

查找并终止单个端口的进程

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

查找并终止多个端口的进程

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

自定义函数

可以在.bashrc.zshrc等文件中添加以下函数:

1
2
3
4
5
6
7
8
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
}

使用方法:

1
kill-by-port 3000

最佳实践

  • 优先使用软终止信号(如-15-3),避免数据丢失或资源泄漏。
  • 将常用的命令封装成函数或脚本,方便重复使用。
  • package.json中添加端口清理命令,确保每次启动服务时端口可用。

常见问题

无法找到进程的PID

如果使用lsof -i:PID无法找到进程的PID,可以以超级用户身份登录并再次运行该命令:

1
2
sudo su
lsof -i:PID

kill -9 PID 不起作用

如果使用kill -9 PID无法终止进程,可能是因为进程以不同的账户(如root账户)启动。可以以超级用户身份登录并再次执行该命令:

1
2
sudo su
kill -9 PID

在Mac上查找并终止监听3000端口的进程
https://119291.xyz/posts/2025-05-12.find-and-kill-processes-listening-to-port-3000-on-mac/
作者
ww
发布于
2025年5月12日
许可协议