我有一个侦听端口的简单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)
我以错误的方式关闭程序吗?我怎样才能防止这种情况发生?
答案 0 :(得分:366)
要结束该程序,您应该使用 Ctrl + C 。如果你这样做,它会发送SIGINT
,它允许程序正常结束,从正在监听的任何端口解除绑定。
答案 1 :(得分:302)
Ctrl + Z 暂停它,这意味着它仍然可以正在运行。
Ctrl + C 实际上会将其删除。
你也可以像这样手动杀死它:
ps aux | grep node
找到进程ID(左起第二个):
kill -9 PROCESS_ID
这可能也有效
killall node
答案 2 :(得分:34)
或者你可以在一行中完成所有这些:
kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
您可以替换' \ snode \ s'内的节点。与任何其他进程名称。
答案 3 :(得分:21)
您可以键入.exit
以退出节点js REPL
答案 4 :(得分:18)
如果您以交互方式运行Node.js(REPL):
Ctrl + C 会将您带回>提示然后输入:
process.exit()
或只使用 Ctrl + D 。
答案 5 :(得分:16)
$ sudo killall node
适用于 mac ,而killall node
无效:
$ killall node
No matching processes belonging to you were found
答案 6 :(得分:15)
Ctrl+Z suspends it, which means it is still running as a suspended background process.
您现在可能处于终端提示符...
命令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来自对问题本身的评论。我有同样的问题,他的评论帮助我自己解决了。
答案 7 :(得分:7)
在Linux上尝试:pkill node
在Windows上:
Taskkill /IM node.exe /F
或
from subprocess import call
call(['taskkill', '/IM', 'node.exe', '/F'])
答案 8 :(得分:4)
虽然这是一个迟到的答案,但我从NodeJS docs找到了这个:
当退出REPL时,通过接收
.exit
命令作为输入,用户按<ctrl>-C
两次以发出SIGINT信号,或按<ctrl>-D
来发出'exit'事件输入流上的信号'结束'。在没有任何参数的情况下调用侦听器回调。
总而言之,您可以退出:
.exit
<ctrl>-C
。 <ctrl>-D
。 process.exit(0)
表示从REPL自然退出。如果要返回任何其他状态,可以返回非零数字。 process.kill(process.pid)
是在代码中或从REPL中使用nodejs api的方法。答案 9 :(得分:4)
我正在添加这个答案,因为对于许多具有生产部署的项目,我们有脚本可以停止这些流程,所以我们不必这样做。
管理Node Server进程的一种简洁方法是使用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
这将彻底关闭您的服务器应用程序。
答案 10 :(得分:2)
我遇到了运行多节点服务器的问题,我想只杀死其中一个并从脚本重新部署它。
注意:此示例位于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
。
答案 11 :(得分:2)
最新答案,但在Windows上,使用CTRL + ALT + DEL打开任务管理器,然后杀死Node.js进程将解决此错误。
答案 12 :(得分:2)
如果您想使用npm stop
或类似的内容停止服务器。您可以将杀死服务器进程的代码编写为:
require('child_process').exec(`kill -9 ${pid}`)
检查此链接以获取详细信息: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
答案 13 :(得分:1)
对于MacOS
运行以下代码,然后按Enter键
sudo kill $(sudo lsof -t -i:4200)
答案 14 :(得分:0)
我的用例:在 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
有关通过端口查找进程的更多信息:Who is listening on a given TCP port on Mac OS X?
答案 15 :(得分:0)
对于Windows,请先使用您的端口号搜索PID
netstat -ano | findStr "portNumber"
答案 16 :(得分:0)
您可以按照以下命令工作,以特定于localserver kill(此处为8000)
http://localhost:8000/杀死PID(processId):
$:lsof -i tcp:8000
它将为您提供以下TCP组:
命令PID用户FD类型设备大小/关闭节点名称
节点21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(听)
$:kill -9 21521
它将杀死对应于TCP *:8000的processId
答案 17 :(得分:0)
您可以使用 fuser 来完成所需的工作。
为了获取在端口上运行的任务的进程ID,您可以执行以下操作:
fuser <<target_port>>/tcp
假设端口为8888,命令将变为:
fuser 8888/tcp
要想杀死在端口上运行的进程,只需添加-k开关即可。
fuser <<target_port>>/tcp -k
示例(端口为8888):
fuser 8888/tcp -k
就是这样!它将关闭在端口上侦听的进程。 我通常在运行服务器应用程序之前执行此操作。
答案 18 :(得分:0)