端口3000已被占用 [nodemon] 应用程序崩溃 - 等待文件更改后再启动

10
端口3000已被占用:
[nodemon] 应用程序崩溃 - 等待文件更改后再启动...
我该如何解决这个问题?

你试过关闭并重新打开终端吗? - Jaydip Jadhav
尝试使用其他端口或关闭在3000端口运行的任何程序。 - Nicolae Maties
问题似乎很明显 - 有东西正在使用3000端口。你尝试过什么? - Weedoze
@JaydipJadhav 是的,兄弟,没有打开的终端。 - Afeesudheen
1
离题并且应该在serverfault.com上,但很可能已经有重复的内容了。 - JGurtz
7个回答

33

结束占用3000端口的进程

类Unix操作系统(例如GNU / Linux,FreeBSD,macOS)

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

使用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

Microsoft Windows

除非您在Windows Subsystem for Linux (WSL)上运行nodemon,否则lsof在Windows上不可用。但是,netstat在Windows shell中可用:

netstat -ano | findstr :3000

这将返回使用端口3000的进程PID,我们可以使用tskill命令杀死该进程:

tskill 12345

如果你只关心确保拥有端口的进程已经死亡,而不需要进行任何优雅的关闭,那么可以忽略下面的警告。
在Windows上终止进程的行为有一个警告:
如果你的应用程序监听SIGTERM以便在nodemon触发tskill命令时进行优雅的关闭,那么Windows将在你的应用程序有机会触发process.on('SIGTERM')事件处理程序之前无条件终止你的进程。
有关此警告的更多详细信息,请参见以下链接: Node.js > Process > Signal Events libuv文档 有时由于某些原因,tskill命令无法运行。您也可以使用上面netstat命令查找PID后使用以下命令来结束进程。
taskkill /F /T /PID 12345

让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命令,从而杀死它生成的子进程,以保持端口开放。
有关nodemon事件的更多信息,请查看其文档:

如何在Windows上运行“事件”?请同时编写Windows事件。 - Mohmmad Ebrahimi Aval
12345实际上代表什么?这是文件夹名称的意思吗? - sniffingdoggo
不,12345是当前监听给定端口的进程的“pid”(进程ID)。有了这个知识,你现在可以杀死该进程。 @stackunderflow 很棒的答案。谢谢 - Joseph Merdrignac

31
从我对这个问题的回答借鉴:

  1. kill-port节点包作为dev依赖项安装:

npm install kill-port --save-dev
创建一个名为 nodemon.json 的文件,放在你的项目根目录下,文件内容如下:
{
  "events": {
    "restart": "kill-port 3000",
    "crash": "kill-port 3000"
  },
  "delay": "1500"
}
然后,在您的package.json文件中,应该有类似以下的内容:
"scripts": {
    "start-dev": "nodemon app.js",
}
  • 然后使用以下命令以开发模式启动您的应用程序:

  • npm run start-dev
    

    这对我没用。很奇怪,因为nodemon直到今天都在工作。 - Tomas Lukac
    对我没用,@TomasLukac 情况相同。 - Zeyad Shaban
    它能够工作,但并没有解决根本原因。 - Petrunov
    1
    它对我来说运行得非常好,除了必须将kill-port安装为全局。 - jslipknot
    如果它不能正常工作,请将其更改为“kill-port --port 3000”。 - Samundra Khatri

    5

    解决此问题的最佳方法是使用以下命令直接关闭端口。

    fuser -n tcp -k 3000
    

    但是我需要在每次服务器重新启动时运行它!这甚至比直接运行node app.js还糟糕。 - Zeyad Shaban

    0

    我曾经遇到过类似的问题,即使我关闭了终端,nodemon仍然继续监视文件更改。我停止了所有的node进程(不仅仅是使用该端口的node进程)。


    0
    您可以在终端使用以下命令来检查哪个进程正在使用该端口:
    netstat -aon | findstr '[port_number]'
    

    如果不需要该进程,您可以终止该进程并在端口3000上启动自己的进程。否则,您可以为应用程序使用另一个端口。
    最有可能的是这个进程将是nodemon,您可以杀死并重新启动它。

    -2

    看起来另一个进程正在使用该端口。您可以尝试使用此处提供的解决方案(根据您的操作系统)来终止在端口3000上运行的进程。


    -2

    看起来3000端口正在使用中。您可以终止使用3000端口的进程,或者将节点的端口从3000更改为任何其他端口。


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