我有一个简单的TCP服务器,可以监听端口.
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!\n");
});
server.listen(7777);
Run Code Online (Sandbox Code Playgroud)
我启动它,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)
Run Code Online (Sandbox Code Playgroud)
我以错误的方式关闭程序吗?我怎样才能防止这种情况发生?
Bra*_*rad 381
要结束该程序,您应该使用Ctrl+ C.如果您这样做,它会发送SIGINT
,它允许程序正常结束,从正在侦听的任何端口解除绑定.
另见:https: //superuser.com/a/262948/48624
Jam*_*son 314
Ctrl+ Z暂停它,这意味着它仍然可以运行.
Ctrl+ C实际上会杀了它.
你也可以像这样手动杀死它:
ps aux | grep node
Run Code Online (Sandbox Code Playgroud)
找到进程ID(左起第二个):
kill -9 PROCESS_ID
Run Code Online (Sandbox Code Playgroud)
这也可行
killall node
Run Code Online (Sandbox Code Playgroud)
Ham*_*oli 37
或者您也可以在一行中完成所有这些操作:
kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)
您可以将'\ snode\s'中的节点替换为任何其他进程名称.
Met*_*her 19
Ctrl+ Z暂停它,这意味着它仍然作为暂停的后台进程运行.
你很可能现在在终端提示...
命令fg
在前台恢复进程.
键入Ctrl+ C以正确杀死它.
(注意:以下命令可能需要root,sudo ...
你的朋友也是如此)
pkill -9 node
Run Code Online (Sandbox Code Playgroud)
或者,如果你没有pkill,这可能有效:
killall node
Run Code Online (Sandbox Code Playgroud)
或许这个:
kill $(ps -e | grep node | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)
有时候这个过程会列出自己的grep,在这种情况下你需要:
kill $(ps -e | grep dmn | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)
.
h/t @ruffin来自对问题本身的评论.我有同样的问题,他的评论帮助我自己解决了.
小智 18
如果您以交互方式运行Node.js(REPL):
Ctrl+ C将收回>提示然后键入:
process.exit()
Run Code Online (Sandbox Code Playgroud)
或者只是使用Ctrl+ D.
Max*_*mov 17
$ sudo killall node
在另一个终端在Mac上killall node
工作,而不工作:
$ killall node
No matching processes belonging to you were found
Run Code Online (Sandbox Code Playgroud)
Jas*_*son 12
在linux上试试: pkill node
在Windows上:
Taskkill /IM node.exe /F
Run Code Online (Sandbox Code Playgroud)
要么
from subprocess import call
call(['taskkill', '/IM', 'node.exe', '/F'])
Run Code Online (Sandbox Code Playgroud)
小智 8
您可以使用fuser来完成您想要完成的工作。
为了获取在端口上运行的任务的进程 ID,您可以执行以下操作:
fuser <<target_port>>/tcp
Run Code Online (Sandbox Code Playgroud)
假设端口是 8888,命令变为:
fuser 8888/tcp
Run Code Online (Sandbox Code Playgroud)
要终止在端口上运行的进程,只需添加 -k 开关。
fuser <<target_port>>/tcp -k
Run Code Online (Sandbox Code Playgroud)
示例(端口为 8888):
fuser 8888/tcp -k
Run Code Online (Sandbox Code Playgroud)
就是这样!它将关闭监听端口的进程。我通常在运行我的服务器应用程序之前这样做。
您可以使用以下命令来特定于 localserver kill(here: 8000)
http://localhost:8000/杀死 PID(processId):
$:lsof -i tcp:8000
Run Code Online (Sandbox Code Playgroud)
它将为您提供以下 TCP 组:
命令 PID 用户 FD 类型 设备大小/关闭节点名称
节点 21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(听)
$:kill -9 21521
Run Code Online (Sandbox Code Playgroud)
它会杀死对应于 TCP*:8000 的 processId
小智 5
如果你想停止你的服务器npm stop
或类似的东西。您可以将杀死服务器进程的代码编写为:
require('child_process').exec(`kill -9 ${pid}`)
Run Code Online (Sandbox Code Playgroud)
检查此链接的详细信息:https : //gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
虽然这是一个较晚的答案,但我是从NodeJS docs找到的:
通过接收
.exit
命令作为输入,用户按<ctrl>-C
两次以向SIGINT发信号或通过按<ctrl>-D
以在输入流中发信号指示“结束” 而退出REPL时,将发出“退出”事件。侦听器回调不带任何参数而被调用。
因此,总结一下,您可以退出:
.exit
在nodejs REPL中输入。<ctrl>-C
两次。<ctrl>-D
。process.exit(0)
意味着从REPL自然退出。如果要返回任何其他状态,则可以返回非零数字。process.kill(process.pid)
是从您的代码或REPL中使用nodejs api杀死的方法。我要添加这个答案,因为对于许多具有生产部署的项目,我们有停止这些过程的脚本,因此我们不必这样做。
一种管理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
这将彻底关闭您的服务器应用程序。
小智 5
对于 MacOS
运行下面的代码并按回车键
sudo kill $(sudo lsof -t -i:4200)
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
503528 次 |
最近记录: |