从命令行停止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 node
在mac上工作 ,而killall node
不工作:
$ killall node No matching processes belonging to you were found
恢复并终止进程:
Ctrl + Z挂起它,这意味着它仍然作为暂停的后台进程运行。
您现在可能在terminal提示符下
-
给命令
fg
在前台恢复进程。 -
键入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被调用,没有任何参数。
所以总结一下你可以通过以下途径退出:
- 在nodejs REPL中input
.exit
。 - 按
<ctrl>-C
两次。 - 按下
<ctrl>-D
。 -
process.exit(0)
表示从REPL自然退出。 如果你想返回任何其他状态,你可以返回一个非零的数字。 -
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
。