我有一个简单的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)
我关闭程序的方式是否错误?我怎样才能防止这种情况发生呢?
恢复并终止进程:
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来自对问题本身的评论。我也有同样的问题,他的评论帮助我自己解决了问题。
我遇到了一个问题,有多个节点服务器正在运行,我只想杀死其中一个并从脚本重新部署它。
注意:这个例子在Mac上的bash shell中。
为此,我确保我的节点调用尽可能具体。例如,我没有从apps目录调用节点server.js,而是调用节点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的节点进程。
如果你运行节点app_name_2/app/server.js,该节点进程将继续运行。
如果你决定杀死他们,你可以使用killall节点,就像其他人提到的那样。
我添加这个答案是因为对于许多具有生产部署的项目,我们有停止这些过程的脚本,所以我们不必这样做。
管理Node Server进程的一种干净的方法是使用永久包(来自NPM)。
例子:
安装永远
NPM install forever -g
运行节点服务器
永久启动-al ./logs/ Forever .log -ao ./logs/out.log -ae ./logs/err.log server.js
结果:
永远处理文件:server.js
关机节点服务器
永远停止server.js
结果
永久停止进程:
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
这将彻底关闭服务器应用程序。
我的用例:在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;运行
有关通过端口查找进程的更多信息:谁正在监听Mac OS X上的给定TCP端口?