从命令行停止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)

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

714488 次浏览

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

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

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

Ctrl+C会杀死它。

你也可以像这样手动杀死它:

ps aux | grep node

查找进程ID(左起第二):

kill -9 PROCESS_ID

这也可能有用

killall node

另一个终端中的$ sudo killall nodemac上工作,而killall node不工作:

$ killall node
No matching processes belonging to you were found

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

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

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

process.exit()

或者直接使用Ctrl + D

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

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

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

如果你想用npm stop或类似的东西来停止你的服务器。你可以编写这样的代码来杀死你的服务器进程:

require('child_process').exec(`kill -9 ${pid}`)

查看详细信息: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5 < / p >

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

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

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

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

我遇到了一个问题,我有多节点服务器运行,我想杀一个就行了并从脚本重新部署它。

注意:这个例子在Mac上的bash shell中。

为此,我确保node调用尽可能具体。例如,我没有从apps目录调用node server.js,而是调用node app_name_1/app/server.js

然后我可以杀死它使用:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

这只会杀死运行app_name_1/app/server.js的节点进程。

如果运行node app_name_2/app/server.js,该节点进程将继续运行。

如果你决定要杀死它们,你可以像其他人提到的那样使用killall node

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

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

例子:

安装永远

< p > <代码> NPM install forever -g < /代码> < / p >

运行节点服务器

< p > <代码> 永久启动-al ./logs/ Forever .log -ao ./logs/out.log -ae ./logs/err.log server.js < /代码> < / p >

结果:

< p > <代码> 永远处理文件:server.js < /代码> < / p >

关机节点服务器

< p > <代码> 永远停止server.js < /代码> < / p >

结果

< p > <代码> 永久停止进程: 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 < /代码> < / p >

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

在linux上尝试:pkill node

在windows上:

Taskkill /IM node.exe /F

from subprocess import call


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

我的用例:在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 ; run

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

在windows上,用CTRL+ALT+DEL打开任务管理器,然后杀死Node.js进程可以解决这个错误。

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

netstat -ano | findStr "portNumber"

之后,结束任务,确保你在你的“c”驱动器的根enter image description here 该命令将是taskkill /F /PID your pid

你可以在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

对于MacOS

  1. 打开终端
  2. 运行下面的代码并按enter

     sudo kill $(sudo lsof -t -i:4200)
    

你可以使用熔化炉来得到你想要做的事情。

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

fuser <<target_port>>/tcp

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

fuser 8888/tcp

杀了是一个运行在端口上的进程,只需添加-k switch。

fuser <<target_port>>/tcp -k

示例(端口为8888):

fuser 8888/tcp -k
< p >就是这样!它将关闭监听端口的进程。 我通常在运行我的服务器应用程序之前这样做

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

enter image description here

出现提示时按“y”。

enter image description here

谢谢