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

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


当前回答

恢复并终止进程:

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

你现在可能会看到终端提示……

在前台输入fg命令恢复进程。 按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来自对问题本身的评论。我也有同样的问题,他的评论帮助我自己解决了问题。

其他回答

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

运行:“cd $PATH1 && node server1.js & cd $PATH2 && node server2.js &…”

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

stop2 stop3…

重新运行:“stop1 & stop2 &…& stopN;运行

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

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

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

fuser <<target_port>>/tcp

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

fuser 8888/tcp

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

fuser <<target_port>>/tcp -k

示例(端口为8888):

fuser 8888/tcp -k

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

或者你可以在一行中完成所有这些:

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

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

Linux下尝试:pkill节点

在windows上:

Taskkill /IM node.exe /F

or

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])

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