我有一个简单的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)

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


当前回答

在windows上,用CTRL+ALT+DEL打开任务管理器,然后杀死Node.js进程可以解决这个错误。

其他回答

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

注意:这个例子在Mac上的bash shell中。

为此,我确保我的节点调用尽可能具体。例如,我没有从apps目录调用节点server.js,而是调用节点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的节点进程。

如果你运行节点app_name_2/app/server.js,该节点进程将继续运行。

如果你决定杀死他们,你可以使用killall节点,就像其他人提到的那样。

是操作系统

打开终端 运行下面的代码并按enter键 Sudo kill $(Sudo lsof -t:4200)

如果你想用npm stop来停止你的服务器。你可以编写这样的代码来杀死你的服务器进程:

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

查看这个链接了解详细信息: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

你可以输入.exit退出节点js REPL

你可以使用fuser来完成你想做的事情。

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

fuser <<target_port>>/tcp

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

fuser 8888/tcp

要终止端口上运行的进程,只需添加-k开关。

fuser <<target_port>>/tcp -k

示例(端口为8888):

fuser 8888/tcp -k

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