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

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


当前回答

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

当REPL退出时,通过接收.exit命令作为输入,用户按下<ctrl>-C两次发出SIGINT信号,或者按下<ctrl>-D在输入流上发出'end'信号,都会触发'exit'事件。侦听器回调调用时不带任何参数。

总结一下,你可以通过以下方式退出:

在nodejs的REPL中输入.exit。 按两次<ctrl>-C。 按< ctrl > - d。 process.exit(0)表示从REPL中自然退出。如果你想返回任何其他状态,你可以返回一个非零的数字。 process.kill(process.pid)是使用nodejs api从代码中或从REPL中进行kill的方法。

其他回答

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

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

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

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

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

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

管理Node Server进程的一种干净的方法是使用永久包(来自NPM)。

例子:

安装永远

NPM install forever -g

运行节点服务器

永久启动-al ./logs/ Forever .log -ao ./logs/out.log -ae ./logs/err.log server.js

结果:

永远处理文件:server.js

关机节点服务器

永远停止server.js

结果

永久停止进程: Uid命令脚本永久pid id logfile正常运行时间 [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0:0.247

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

我的用例:在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端口?

Linux下尝试:pkill节点

在windows上:

Taskkill /IM node.exe /F

or

from subprocess import call

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