334

我有一个侦听端口的简单 TCP 服务器。

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

node server.js在 Mac 上用 Ctrl + Z 启动它,然后用它关闭它。当我尝试再次运行它时,node server.js我收到以下错误消息:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

我是否以错误的方式关闭程序?我怎样才能防止这种情况发生?

4

19 回答 19

413

要结束程序,您应该使用Ctrl+ C。如果你这样做,它会发送SIGINT,这允许程序优雅地结束,从它正在侦听的任何端口中解除绑定。

另见: https ://superuser.com/a/262948/48624

于 2012-05-09T19:16:53.357 回答
367

Ctrl+Z暂停它,这意味着它仍然可以运行。

Ctrl+C实际上会杀死它。

你也可以像这样手动杀死它:

ps aux | grep node

查找进程 ID(左起第二个):

kill -9 PROCESS_ID

这也可能有效

killall node
于 2012-05-09T19:21:46.607 回答
39

或者,您可以在一行中完成所有这些操作:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

您可以将 '\snode\s' 中的节点替换为任何其他进程名称。

于 2014-09-22T15:17:29.760 回答
29

恢复并终止进程:

Ctrl+Z挂起它,这意味着它仍然作为挂起的后台进程运行。

您现在可能处于终端提示符下...

  1. 发出命令fg以在前台恢复进程。

  2. 键入Ctrl+C以正确杀死它。


或者,您可以像这样手动杀死它:

注意:以下命令可能需要 root,sudo ...您的朋友也是如此)

pkill -9 node

或者,如果您没有 pkill,这可能有效:

killall node

或者这个:

kill $(ps -e | grep node | awk '{print $1}')

有时该过程会列出自己的 grep,在这种情况下,您需要:

kill $(ps -e | grep dmn | awk '{print $2}')

.


h/t @ruffin 来自对问题本身的评论。我有同样的问题,他的评论帮助我自己解决了这个问题。

于 2017-05-26T21:48:40.263 回答
22

你可以输入.exit 退出 node js REPL

于 2013-07-22T10:12:09.023 回答
21

如果您以交互方式运行 Node.js(REPL):

Ctrl+C将带您回到 > 提示符,然后键入:

process.exit()

或仅使用Ctrl+ D

于 2014-02-15T07:54:25.160 回答
17

$ sudo killall node在另一个终端上工作mac,但killall node不工作:

$ killall node
No matching processes belonging to you were found
于 2013-06-18T12:53:26.210 回答
15

在linux上尝试:pkill node

在窗户上:

Taskkill /IM node.exe /F

或者

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
于 2018-07-18T18:26:21.663 回答
10

您可以在 localserver kill(此处:8000)中执行以下命令

http://localhost:8000/杀死 PID(processId):

$:lsof -i tcp:8000

它将为您提供以下 TCP 组:

命令 PID 用户 FD 类型 设备尺寸/关闭节点名称

节点 21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000 (LISTEN)

$:kill -9 21521

它将杀死对应于 TCP*:8000 的 processId

于 2019-08-17T13:42:18.810 回答
9

您可以使用fuser来完成您想要完成的工作。

为了获取在端口上运行的任务的进程 ID,您可以执行以下操作:

fuser <<target_port>>/tcp

假设端口是8888,命令变为:

fuser 8888/tcp

杀死在端口上运行的进程,只需添加 -k 开关。

fuser <<target_port>>/tcp -k

示例(端口为 8888):

fuser 8888/tcp -k

就是这样!它将关闭侦听端口的进程。我通常在运行我的服务器应用程序之前执行此操作。

于 2019-12-08T16:57:49.130 回答
6

虽然这是一个迟到的答案,但我从NodeJS 文档中找到了这个:

.exit当 REPL 通过接收命令作为输入、用户按<ctrl>-C两次以发出 SIGINT 信号或通过<ctrl>-D在输入流上按以发出“结束”信号来退出 REPL 时,将发出“退出”事件。侦听器回调在没有任何参数的情况下被调用。

总而言之,您可以通过以下方式退出:

  1. 输入.exitnodejs REPL。
  2. <ctrl>-C两次。
  3. 按下<ctrl>-D
  4. process.exit(0)意味着从 REPL 中自然退出。如果您想返回任何其他状态,您可以返回一个非零数字。
  5. process.kill(process.pid)是在您的代码或 REPL 中使用 nodejs api 杀死的方法。
于 2016-09-22T16:41:06.670 回答
6

对于 MacOS

  1. 打开终端
  2. 运行以下代码并回车

     sudo kill $(sudo lsof -t -i:4200)
    
于 2019-08-29T06:11:45.880 回答
5

如果你想停止你的服务器npm stop或类似的东西。您可以编写杀死服务器进程的代码:

require('child_process').exec(`kill -9 ${pid}`)

检查此链接的详细信息: https ://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

于 2016-01-31T03:06:12.807 回答
5

我添加这个答案是因为对于许多具有生产部署的项目,我们有停止这些过程的脚本,所以我们不必这样做。

管理 Node Server 进程的一种简洁方法是使用forever包(来自NPM)。

例子:

永久安装

npm install forever -g

运行节点服务器

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

结果:

info: Forever processing file: server.js

关闭节点服务器

forever stop server.js

结果

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

这将彻底关闭您的服务器应用程序。

于 2017-07-08T18:40:00.207 回答
3

我遇到了一个问题,我有多个节点服务器正在运行,我只想杀死其中一个并从脚本重新部署它。

注意:此示例位于 Mac 上的 bash shell 中。

为此,我确保我的node电话尽可能具体。例如,我不是node server.js从应用程序目录调用,而是调用node app_name_1/app/server.js

然后我可以使用以下方法杀死它:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

这只会杀死运行 app_name_1/app/server.js 的节点进程。

如果你运行了node app_name_2/app/server.js这个节点进程将继续运行。

如果您决定要杀死它们,则可以killall node像其他人提到的那样使用它们。

于 2017-07-06T02:51:20.200 回答
2

迟到的答案,但在 Windows 上,使用 CTRL+ALT+DEL 打开任务管理器然后杀死 Node.js 进程将解决此错误。

于 2018-10-20T04:32:33.057 回答
1

我的用例:在MacOS上,通过脚本在不同端口上运行/重新运行多个节点服务器

运行"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

停止1"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

停止2,停止3...

重新运行"stop1 & stop2 & ... & stopN ; run

有关通过端口查找进程的更多信息:谁在 Mac OS X 上的给定 TCP 端口上侦听?

于 2018-08-07T16:41:41.027 回答
1

对于 Windows,首先使用您的端口号搜索 PID

netstat -ano | findStr "portNumber"

之后,杀死任务,确保你在你的“c”驱动器的根目录下在此处输入图像描述 ,命令将是taskkill /F /PID your pid

于 2019-06-12T14:35:11.003 回答
1

如果您使用的是 VS Code 和终端,请先从右侧下拉列表中选择节点,然后执行 Ctrl + C。然后它将起作用

在此处输入图像描述

出现提示时按 y。

在此处输入图像描述

谢谢

于 2020-04-11T12:44:51.130 回答