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

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


当前回答

$ sudo killall节点在另一个终端在mac上工作,而killall节点不工作:

$ killall node
No matching processes belonging to you were found

其他回答

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

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

fuser <<target_port>>/tcp

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

fuser 8888/tcp

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

fuser <<target_port>>/tcp -k

示例(端口为8888):

fuser 8888/tcp -k

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

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

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

如果你使用VS Code和终端选择节点从右边的下拉菜单,然后按Ctrl + c,然后它将工作

出现提示时按“y”。

谢谢

$ sudo killall节点在另一个终端在mac上工作,而killall节点不工作:

$ killall node
No matching processes belonging to you were found

对于windows,首先用端口号搜索PID

netstat -ano | findStr "portNumber"

在那之后,杀死任务,确保你在根你的“c”驱动器 命令是taskkill /F /PID你的PID