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

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


当前回答

你可以在localserver kill中使用以下命令(这里是8000)

http://localhost:8000/ kill PID(processId):

$:lsof -i tcp:8000

它会给你以下几组tcp:

命令pid user fd类型设备大小/关闭节点名称 节点21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000 (LISTEN)

$:kill -9 21521

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

其他回答

虽然这是一个晚的答案,但我从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的方法。

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

Ctrl + C将带你回到>提示,然后输入:

process.exit()

或者使用Ctrl + D。

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

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

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

恢复并终止进程:

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来自对问题本身的评论。我也有同样的问题,他的评论帮助我自己解决了问题。

是操作系统

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