Node.js端口号3000已被占用,但实际上并没有被占用?

385

我已经在一个node.js项目上工作了几周,一切进展顺利。通常,我使用npm start来运行我的应用程序,并在本地主机上的浏览器中查看它,端口为3000。

今天,在使用npm start时,我开始遇到以下错误:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

我已经检查了资源监视器,没有其他进程在端口3000上运行。为什么会出现这个错误信息?

在我的app.js中,我有以下代码来设置端口...这是否不正确?之前它运行得很好,所以我不确定我做错了什么。

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

感谢您的帮助!


编辑:

我已经尝试运行netstat和TCPView来检查使用该端口的进程,但没有任何东西在使用该端口。我还尝试重新启动我的笔记本电脑,但仍然遇到相同的错误。


1
你尝试过访问 https://dev59.com/nXVD5IYBdhLWcg3wOo5h 吗? - Isaac
1
网站图标将被缓存。您也可以尝试在命令提示符中使用 netstat,或者使用类似于 PuTTY 的 telnet 等价物连接到 localhost:3000。 - Blorgbeard
7
我注意到你在“服务器已经启动在端口3000上”之后收到了“端口3000已经被占用”的消息 - 你的应用程序中是否有尝试再次在同一端口上开始监听的操作? - Blorgbeard
10
我猜测你的应用程序中有两个 app.listen() 语句,再加上另一个 .listen() 也试图在同一端口启动服务器。第一个运行成功,而第二个会报错。请搜索你的代码中是否存在 .listen - jfriend00
对我来说,问题出在我的 .env 文件上 - 所以请确保其中没有语法错误。 - SMEETT
显示剩余10条评论
46个回答

749

你可以搜索如何杀死该进程。

对于 Linux/Mac 操作系统,请在终端中搜索以下命令: (sudo) run

$ lsof -i tcp:3000
$ kill -9 PID

在 Windows 上:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

在 Git Bash 中将 tskill 更改为 taskkill


3
我曾尝试了多种 Windows 解决方案,但这个找到了占用端口的奇怪进程。因为除了在 Windows 上工作外,还包括了 Linux 方法,所以我给了它点赞。 - truedat101
5
在 Windows 系统中,tskill 对我无效。使用 taskkill /F /PID myPIDhere 命令可以生效。 - snersesyan
7
仅使用 lsof 命令没有任何输出,但是使用 sudo lsof 命令可以得到一些输出,并且终止相关进程解决了这个问题。 - user985366
2
taskkill在git-bash上对我无效,但tskill有效。谢谢。 - nickcamillo
1
我杀掉了进程,但另一个进程立即以不同的PID启动,并且也使用端口3000。 - Ben Alan
显示剩余8条评论

495
您可以使用以下命令作为参考来终止在特定端口上运行的进程:
npx kill-port 3000

enter image description here


要终止多个端口上的进程,可以使用以下命令:

npx kill-port 3000 8080 4200

15
我不知道这个包裹的存在。才上午7:30,我的一天就已经美好了。 - Matt West

62

有时候会发生,就像 @sova 建议的那样,我有时也会遇到 EADDR in use 的问题。通常情况下,后台可能还有一个终端窗口在运行该应用程序。对我也是适用的。

当你已经打开终端很长时间,它可能会发生。没错,你想要停止这个进程。但有时它并未在后台停止。因此,最好的解决方案是关闭终端并重新启动它。这将解决你的问题。对我来说,这种方法很有效。

另外,

sudo lsof -i:<PORT_NO>

暂时关闭实例但无法停止后台进程。因此,仅限一次操作,

sudo kill <PID>

工作正常,但当我们更新代码并保存时,这个问题会再次发生,就像 Nodemon 一样。

因此,退出终端将解决这个问题。

  killall -9 node

6
lsof 和 netstat 都没有返回任何内容,但仍然似乎有一些进程在使用该端口。执行 killall -9 node 后,我才能在本地运行服务器。 - Julius
感谢使用“killall -9 node”命令。它在Goorm IDE上运行成功了。 - ifhy
killall -9 node 已执行。谢谢! - saran

35

我也遇到了同样的问题。解决方法如下:(适用于Windows):

  1. 打开任务管理器

  2. 滚动查找一个名为Node.js: Server-side JavaScript的进程任务 Image added for reference

  3. 结束这个特定的任务

完成了!现在运行npm start就可以像以前一样工作了!


34

我也遇到了同样的问题。(以下步骤在Windows 10上可行):

  1. 打开任务管理器(按下 Ctrl+Alt+Delete
  2. 选择“进程”选项卡
  3. 搜索“Node.js: Server-side JavaScript”
  4. 选择它并点击“结束任务”按钮

现在你可以运行npm start了。

希望对你有所帮助。


34

关闭占用3000端口的进程

首先,让我们看一下如何结束一个占用了端口的进程。

使用lsof命令,我们可以获取拥有指定端口的PID:

$ lsof -i :3000 -t
12345

然后我们可以通过执行以下命令来杀死这个进程:

$ kill 12345

让我们将其转化为一行代码:

lsof -i 3000 -t | xargs kill

如果您使用环境变量来设置服务器端口,我们可以指定它,而不是硬编码我们的值:

lsof -i ${PORT} -t | xargs kill

最后,如果环境变量没有设置,我们可以默认使用端口3000:
lsof -i ${PORT:-3000} -t | xargs kill

让nodemon执行钩子

Nodemon允许你通过nodemon.json配置文件设置事件钩子:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

这将导致nodemon在应用程序崩溃时执行sh -c 'lsof -i :${PORT:-3000} -t | xargs kill命令,从而杀死它生成的子进程,该子进程一直保持端口打开状态。

或者您可以尝试这个。

fuser -k PORT-NO/tcp

例如:

fuser -k 3000/tcp

你也可以尝试这个。
fuser -n tcp -k PORT-NO

例如:

fuser -n tcp -k 3000

在Mac上

kill -9 $(lsof -ti:PORT_NO)

例如:

kill -9 $(lsof -ti:9229)

1
这是一个非常好的、干净的解决方案来终止一个进程。每次都要查找如何做,而这是我见过最好的解决方案! - twknab
我遇到了这个问题,尽管没有任何进程从lsof -i :3000 -t返回 =\ - xaunlopez
@xaunlopez 试试这个命令 fuser -k 端口号/tcp - Afeesudheen
1
真正的回应 - Nathan Gouy

27

对于Windows系统,任务管理器一定会显示一个正在运行的node进程。尝试结束该进程,这将解决问题。


20
 killall -9 node

如果你在远程开发时需要退出 VS Code SSH 连接并终止所有可能导致问题的 Node 进程,尤其是如果你有一些正在使用 Node 的生产应用程序,那么上述命令可能会带来风险。更好的方法是使用 netstat 获取所有正在使用端口的 Node 进程,然后按 PID 杀死你想要终止的进程。

 netstat -lntp | grep node

您将获取所有节点过程

 tcp6  0      0 :::5744    :::*    LISTEN     3864/node

然后当您获得PID(3864)时,只需按照PID终止进程

   kill -9 PID
或者
   kill -HUP PID 

1
我在Ubuntu上遇到了同样的错误,解决方法是:1)确保您尚未将端口分配给变量,并且仍在使用引号(“port”)来获取端口连接,而不是变量。其次,在Ubuntu上,您可以使用运行sudo netstat -lp来查找正在使用该端口的进程。 - Snowcat
它带有一个新的端口自动重启,你知道为什么吗? - Yogi Arif Widodo

14

我在使用NodeJS的Express服务器和nodemon。我收到了以下消息,看起来是一个错误:

$ node ./bin/www
Port 3000 is already in use

如果您终止所有节点服务器连接,则有一种通用解决方案,您可以在package.json文件中添加以下代码:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

此外,我已经找到了在Win 10 x64上使用Windows命令和Bash的几种解决方法。

所有的笔记都在这里:


# 终止所有NodeJS服务器连接

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

# 例子:打开Windows任务管理器,在Windows上查看"node.exe"的PID编号

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

# 通过端口号在Windows中结束进程(示例)

帮助:

$ taskkill /?
$ tskill /?

代码1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

代码 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

代码 3:

$ tskill 14228

# 查看特定端口的命令行

在命令提示符中:

$ netstat -ano | find "14228"

在bash中:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# 使用 "tasklist" 命令查找 node.exe

在命令提示符中:

$ tasklist | find "node"

在bash中:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K

你是最棒的 :-) 在 package.json 文件中的 "stop": "taskkill -f -im node.exe" 这一行对我很有用。我通过 SSH 远程工作。我不得不寻找解决方案,我想大概花了一个多小时。所有的 kill 命令等都没有起作用。 - Herman Van Der Blom
我正在使用netstat -ano | find "14228",并想将其与taskkill /PID xxx一起使用。 我无法使用 |> 进行连接。它会报错格式错误。我错过了什么?这是两个命令:netstat -ano | find "14228" | taskkill /PID xxx 或者 netstat -ano | find "14228" > taskkill /PID xxx。我尝试了以下命令: netstat -ano | find "14228" | ( set /P var= && set var ) > taskkill /PID ........ - Gary

12

今天我遇到了同样的问题,但我已经找到了解决方法。

这个问题是因为即使nodemon重启,还有一些node服务在后台运行。

我查看了许多答案,但它们都包含多个命令。对于我的情况,我找到了一个简单的命令。

sudo pkill node

这将终止节点中所有正在运行的进程,使得你的 nodemon 将按预期工作。


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