停止 node.js 服务器的所有实例

IT技术 javascript windows node.js express port
2021-01-19 13:18:51

这是我第一次使用 Node.js,我遇到了这个问题:

我已经通过 IDE 的插件启动了一个 Node 服务器。不幸的是,我无法使用 IDE 的终端。所以我尝试从命令行运行脚本。

这就是问题所在 - 我正在使用 Express module并且我的应用程序正在侦听某个端口 (8080)。当我从命令行启动应用程序时,它会引发此错误:

events.js:71
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: listen EADDRINUSE
    at errnoException (net.js:770:11)
    at HTTPServer.Server._listen2 (net.js:910:14)
    at listen (net.js:937:10)
    at HTTPServer.Server.listen (net.js:986:5)
    at Object.<anonymous> (C:\xampp\htdocs\node\chat\app.js:5:5)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)

尽管我不太确定这个错误是什么,但我认为这是因为应用程序正在侦听一个已经在使用的端口。所以我做了:

netstat -an

我可以看到

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING

这是因为当我尝试从 IDE 启动它时,Node 服务器已经启动。

所以我想知道,如何停止所有服务器实例?另外,如果您能告诉我如何检测端口上正在运行的内容并杀死它。

6个回答

视窗机:

需要杀死一个 Node.js 服务器,并且您没有任何其他 Node 进程在运行,您可以告诉您的机器杀死所有名为 .js 的进程node.exe看起来像这样:

taskkill /im node.exe

如果进程仍然存在,您可以通过添加/f标志来强制进程终止

taskkill /f /im node.exe

如果您需要更细粒度的控制并且只需要杀死在特定端口上运行的服务器,则可以使用netstat找到进程 ID,然后向其发送终止信号。因此,在您的情况下,端口所在的位置8080,您可以运行以下命令:

C:\>netstat -ano | find "LISTENING" | find "8080"

输出的第五列是进程 ID:

  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       14828
  TCP    [::]:8080              [::]:0                 LISTENING       14828

然后,您可以使用taskkill /pid 14828. 如果进程拒绝退出,则只需/f在命令中添加(force) 参数即可。


MacOS机器:

过程几乎相同。您可以终止机器上运行的所有 Node 进程:

killall node

或者也正如@jacob-groundwater 在下面使用的回答中所提到lsof,您可以找到侦听端口的进程的 PID(传递-i标志和端口以显着加快速度):

$ lsof -Pi :8080
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     1073    urname   22u  IPv6  bunchanumbershere      0t0  TCP *:8080 (LISTEN)

在这种情况下,进程 ID 是 PID 列下方的数字,然后您可以将其传递给kill命令:

$ kill 1073

如果进程拒绝退出,那么只需使用-9标志,它是一个SIGTERM不能被忽略标志

$ kill -9 1073

Linux机器:

同样,该过程几乎相同。您可以杀死机器上运行的所有 Node 进程(-$SIGNAL如果SIGKILL不足,请使用):

killall node

或者也可以使用netstat,您可以找到侦听端口的进程的 PID:

$ netstat -nlp | grep :8080
tcp        0      0 0.0.0.0:8080         0.0.0.0:*                   LISTEN      1073/node

在这种情况下,进程 ID 是第六列中进程名称之前的数字,然后您可以将其传递给kill命令:

$ kill 1073

如果进程拒绝退出,那么只需使用-9标志,它是一个SIGTERM不能被忽略标志

$ kill -9 1073
我不得不使用 taskkill /F /IM node.exe 使其工作,谢谢!
2021-03-17 13:18:51
抱歉,我究竟如何使用这些命令?process.exit() 可能在代码中?但服务器已经启动。它很可能是用命令 node app.js 而不是 node-dev app.js 开始的。并且“节点killall”不起作用。我做错了吗?谢谢
2021-03-30 13:18:51
process.exit()在您的应用程序中导致 NodeJS 实例关闭。killall node在 bash 中会杀死在您的机器上运行的所有 NodeJS 实例。
2021-04-03 13:18:51
试试taskkill /IM node.exe它将杀死所有名为node.exe.
2021-04-04 13:18:51
谢谢@六氰化物。我正在 Windows 上开发。这是否会使 killall 节点成为无效命令,因为我无法从命令行使用它。
2021-04-14 13:18:51

适用于 Linux、OS X

killall node
对我不起作用。node: no process found此外,当我为在特定端口上运行的节点进程 grep 时,进程 ID-而不是数字本身。
2021-03-17 13:18:51
简单的方法,但如果任何其他应用程序正在运行,那么我们必须更具体。
2021-03-31 13:18:51

您可以使用lsof获取已绑定到所需端口的进程。

不幸的是,标志似乎因系统而异,但在 Mac OS X 上您可以运行

lsof -Pi | grep LISTEN

例如,在我的机器上,我得到如下信息:

mongod     8662 jacob    6u  IPv4 0x17ceae4e0970fbe9      0t0  TCP localhost:27017 (LISTEN)
mongod     8662 jacob    7u  IPv4 0x17ceae4e0f9c24b1      0t0  TCP localhost:28017 (LISTEN)
memcached  8680 jacob   17u  IPv4 0x17ceae4e0971f7d1      0t0  TCP *:11211 (LISTEN)
memcached  8680 jacob   18u  IPv6 0x17ceae4e0bdf6479      0t0  TCP *:11211 (LISTEN)
mysqld     9394 jacob   10u  IPv4 0x17ceae4e080c4001      0t0  TCP *:3306 (LISTEN)
redis-ser 75429 jacob    4u  IPv4 0x17ceae4e1ba8ea59      0t0  TCP localhost:6379 (LISTEN)

第二个数字是 PID,他们正在侦听的端口位于“(LISTEN)”之前的右侧。找到流氓PID并kill -9 $PID以极端偏见终止。

我不知道如何在 Windows 上做到这一点,对不起 Kiran。
2021-04-02 13:18:51
这是一个很好的答案,尤其是当有多个节点服务器在不同端口上运行时。我可以轻松区分每个端口上运行的进程 ID。
2021-04-06 13:18:51
嗨雅各布,请您编辑答案并添加 Windows 版本,因为我正在 Windows 上开发。谢谢
2021-04-12 13:18:51
lsof cmd 无法识别。
2021-04-12 13:18:51

Windows & GitBash 终端 我需要在 Windows/Webstorm/GitBash 终端中使用这个命令

cmd "/C TASKKILL /IM node.exe /F"
这个是为我做的。谢谢
2021-03-23 13:18:51
这个也是为我做的。我发现这是在 Windows 上杀死所有节点进程的最快方法。
2021-03-24 13:18:51

如果你想杀死一个特定的节点进程,你可以去命令行路由并输入:

ps aux | grep node

获取所有节点进程 ID 的列表。现在你可以得到你的进程 id(pid),然后做:

kill -9 PID

如果您想杀死所有节点进程,请执行以下操作:

killall -9 node

-9 开关就像 Windows 上的结束任务。它将迫使进程结束。你可以做:

kill -l

查看 kill 命令的所有开关及其注释。