从命令行停止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 + Zclosures它。 当我尝试再次运行与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) 

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

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

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

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

Ctrl + C实际上会杀死它。

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

 ps aux | grep node 

查找进程ID(从左边开始):

 kill -9 PROCESS_ID 

这也可能工作

 killall node 

或者,也可以在一行中完成所有这些操作:

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

你可以用'\ snode \ s'中的节点replace任何其他进程名称。

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

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

按Ctrl + C将带您回到>提示符然后input:

 process.exit() 

或者只是使用Ctrl + D。

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

 $ killall node No matching processes belonging to you were found 

恢复并终止进程:

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

您现在可能在terminal提示符下

  1. 给命令fg在前台恢复进程。

  2. 键入Ctrl + C来正确地杀死它。


或者,你可以像这样手动杀死它:

注意:以下命令可能需要root,所以sudo ...是你的朋友)

 pkill -9 node 

或者,如果你没有杀手,这可能工作:

 killall node 

或者也许这样:

 kill $(ps -e | grep node | awk '{print $1}') 

有时这个过程会列出自己的grep,在这种情况下,你需要:

 kill $(ps -e | grep dmn | awk '{print $2}') 


h / t @ruffin从问题本身的评论。 我有同样的问题,他的评论帮助我自己解决。

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

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

查看此链接的详细信息: https : //gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

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

当退出REPL时,通过接收.exit命令作为input,用户按<ctrl>-C两次来发信号SIGINT,或按<ctrl>-D信号给'end'inputstream。 侦听器callback被调用,没有任何参数。

所以总结一下你可以通过以下途径退出:

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

我添加了这个答案,因为对于有生产部署的许多项目,我们有脚本阻止这些进程,所以我们不必。

一个干净的方式来pipe理你的节点服务器进程是使用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

closures节点服务器

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

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

我遇到了一个问题,我有多个节点服务器正在运行,我只想杀死其中的一个,并从脚本中重新部署它。

注意:这个例子在Mac上是一个bash shell。

为此,我确保尽可能使我的node调用具体。 例如,不是从apps目录中调用node app_name_1/app/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