从命令行停止node.js程序

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

我是否以错误的方式关闭程序?如何防止这种情况发生?

Green前端2020/03/19 09:25:55

您可以按照以下命令工作,以特定于localserver kill(此处:8000)

http:// localhost:8000 /杀死PID(processId):

$:lsof -i tcp:8000

它将为您提供以下TCP组:

命令PID用户FD类型设备尺寸/关闭节点名称

节点21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(LISTEN)

$:kill -9 21521

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

小卤蛋猪猪2020/03/19 09:25:55

For windows first search the PID with your port number

netstat -ano | findStr "portNumber"

After that, kill the task, make sure you are in root of your "c" drive 在此处输入图片说明 And the command will be taskkill /F /PID your pid

达蒙西门十三2020/03/19 09:25:55

对于MacOS

  1. 打开终端
  2. 运行以下代码,然后按Enter

     sudo kill $(sudo lsof -t -i:4200)
    
阳光西里小哥2020/03/19 09:25:55

答案较晚,但在Windows上,使用CTRL + ALT + DEL打开任务管理器,然后杀死Node.js进程将解决此错误。

AL村村2020/03/19 09:25:55

虽然这是一个较晚的答案,但我是从NodeJS docs找到的

通过接收.exit命令输入,用户按<ctrl>-C两次以发出SIGINT信号或通过按<ctrl>-D以发出信号“结束”信号而退出REPL时,退出REPL时将发出“退出”事件侦听器回调不带任何参数而被调用。

因此,总结一下,您可以退出:

  1. .exit在nodejs REPL中输入
  2. <ctrl>-C两次。
  3. <ctrl>-D
  4. process.exit(0)意味着从REPL自然退出。如果要返回任何其他状态,则可以返回非零数字。
  5. process.kill(process.pid) 是从您的代码或REPL中使用nodejs api杀死的方法。
Green小卤蛋2020/03/19 09:25:55

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

一种管理节点服务器进程的干净方法是使用forever软件包(来自NPM)。

例:

永久安装

npm install forever -g

运行节点服务器

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

结果:

info: Forever processing file: server.js

关闭节点服务器

forever stop server.js

结果

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

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

路易GO2020/03/19 09:25:55

$ sudo killall node在另一个终端上可在mac上运行,而killall node无法运行:

$ killall node
No matching processes belonging to you were found
梅Harry2020/03/19 09:25:55

要结束程序,您应该使用Ctrl+ C如果这样做,它会发送SIGINT,从而允许程序正常结束,并与正在侦听的任何端口解除绑定。

另请参阅:https : //superuser.com/a/262948/48624

Itachi神乐2020/03/19 09:25:54

您可以键入.exit 以退出节点js REPL

Sam伽罗2020/03/19 09:25:54

Ctrl+ Z挂起它,这意味着它仍然可以运行。

Ctrl+ C实际上会杀死它。

您也可以像这样手动将其杀死:

ps aux | grep node

找到进程ID(从左数第二个):

kill -9 PROCESS_ID

这可能也可以

killall node
A蛋蛋乐2020/03/19 09:25:54

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

Ctrl+ C将带您回到>提示符,然后键入:

process.exit()

或只使用Ctrl+ D