如果我运行端口80的服务器,我尝试使用xmlHTTPrequest我得到这个错误:Error: listen EADDRINUSE
如果我想要请求,当我在端口80上运行服务器时,为什么nodejs有问题呢?对于网络浏览器来说这不是问题:我可以在互联网上冲浪,而服务器正在运行。
服务器是:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
请求:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
sys.puts("State: " + this.readyState);
if (this.readyState == 4) {
sys.puts("Complete.\nBody length: " + this.responseText.length);
sys.puts("Body:\n" + this.responseText);
}
};
xhr.open("GET", "http://mywebsite.com");
xhr.send();
EADDRINUSE
表示listen()
尝试绑定服务器的端口号已在使用中。
因此,在您的情况下,必须已在端口80上运行服务器。
如果您在此端口上运行另一个Web服务器,则必须将node.js放在该服务器后面并通过它进行代理。
您应该检查这样的listening
事件,看看服务器是否真的在听:
var http=require('http');
var server=http.createServer(function(req,res){
res.end('test');
});
server.on('listening',function(){
console.log('ok, server is running');
});
server.listen(80);
这对我有用(我正在使用mac)。运行此命令
lsof -PiTCP -sTCP:LISTEN
这将显示系统正在使用的端口列表。找到节点正在运行的PID
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 17269 hientrq 16u IPv6 0xc42959c6fa30c3b9 0t0 TCP *:51524 (LISTEN)
node 17269 hientrq 19u IPv4 0xc42959c71ae86fc1 0t0 TCP localhost:1337 (LISTEN)
并运行kill -9 [YOUR_PID]
EADDRINUSE
意味着端口(我们尝试在节点应用程序中侦听)已经被使用。为了克服这个问题,我们需要确定哪个进程正在运行该端口。
例如,如果我们试图在3000端口中监听我们的节点应用程序。我们需要检查该端口是否已被任何其他进程使用。
$sudo netstat -plunt |grep :3000
上面的命令给出了以下结果。
tcp6 0 0 :::3000 :::* LISTEN 25315/node
现在您获得了进程ID(25315),杀死了该进程。
kill -9 25315
npm run start
注意:此解决方案适用于linux用户。
sudo kill $(sudo lsof -t -i:80)
强行杀死
sudo kill -9 $(sudo lsof -t -i:80)
使用cmd以上杀死特定端口,然后运行您的服务器
尝试这两个命令,它将停止所有节点进程。
killall 9 node
pkill node
npm start
当您要在运行应用程序的端口上运行任何进程时,会出现此错误。
如何获取在该端口上运行的进程=> command:sudo netstat -ap | grep:3000
输出:您将获得使用该端口的进程信息
tcp 0 0 IPaddress:3000:LISTEN 26869 / node
现在你可以杀死那个进程sudo kill -9 26869
EADDRINUSE表示您的nodejs应用程序的端口已在使用中。
lsof -i tcp:3000
kill -9 processId
我也有同样的问题,我只需关闭终端并打开一个新终端然后运行
node server.js
再次。这对我有用,有些时候只需要等待几秒钟再重复一次。
但这仅适用于开发人员计算机而非服务器控制台。
错误:侦听EADDRINUSE表示您要分配/绑定到应用程序服务器的端口已在使用中。您可以为应用程序分配另一个端口。
或者,如果要将相同的端口分配给应用程序。然后终止在所需端口上运行的应用程序。
对于节点应用程序,您可以尝试的是,通过以下方式查找节点应用程序的进程ID:
ps -aux | grep node
获取进程ID后,执行
kill process_id
在下面的命令中替换您的端口号
sudo lsof -t -i tcp:portNumber | xargs kill -9
我在使用http.client之前(在节点中)看到过这个错误,并且我记得,问题与不在httpClient创建和/或url请求中初始化httpClient或设置错误选项有关。
对我有用的是:
killall -9 node
但这会杀死一个系统进程。
同
ps ax
你可以检查它是否有效。
在Debian上我发现在端口80上运行你需要以root身份发出命令,即
sudo node app.js
我希望它有所帮助
在我的情况下,Apache HTTP Server在端口80上运行,我通过以root身份发出命令解决了它
sudo killall httpd
更新
如果Jenkins已在Mac上安装并运行;
sudo lsof -i tcp:8080
查看sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
似乎还有另一个Node ng服务进程正在运行。通过在控制台(Linux / Mac)中键入它来检查它:
ps aux|grep node
并退出:
kill -9 <NodeProcessId>
或者替代使用
ng serve --port <AnotherFreePortNumber>
在您选择的免费端口上为您的项目提供服务。
在杀死NODE_PORT时,它可能会杀死你的chrome进程或任何正在侦听同一端口的东西,这很烦人。
这个shell脚本可能会有所帮助 - 在我的情况下,端口是1337,但您可以随时更改它
# LOGIC
CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`
for pid in $PORT_PIDS
do
if [[ ${CHROME_PIDS} != *$pid* ]];then
# NOT FOUND IN CHROME PIDS
echo "Killing $pid..."
ps -p "$pid"
kill -kill "$pid"
fi
done
sails lift
# OR 'node app' OR whatever that starts your node
exit
在我的情况下,我使用网络托管,但在本地主机中是相同的,我用过:
ps -aef | grep 'node'
然后,为了监视节点进程,控制台用PID显示进程。要杀死你必须使用此命令的进程:
kill -9 PID
其中PID是上述命令的进程ID。
两个服务器无法在同一端口上侦听,因此请检查其他服务器是否在同一端口上侦听,如果在同一端口上运行,还要检查浏览器同步
对于Windows 10上的其他人,节点为localhost
并在像3500这样的端口上运行,而不是80 ...
什么行不通:
killall ? command not found
ps -aux | grep 'node' ? ps: user x unknown
什么显示信息但仍然不起作用:
ps -aef | grep 'node'
ps ax
kill -9 61864
什么工作:
Windows上的Git Bash或Powershell
net -a -o | grep 3500 (whatever port you are looking for)
注意PID(最右边)
我无法让killall
工作......所以
现在,在Windows上运行不那么有趣之后,我意识到我可以使用任务管理器找到Node引擎并结束它。
仅供参考,我使用Visual Studio Code在端口3500上运行Node,我在VS代码中使用Git Bash shell。我已经用Ctrl + C优雅地退出了,但有时这并没有杀死它。我不想更改我的端口或重启,所以这有效。希望它能帮助别人。否则它是我自己的文档。
对我有用的选项:
跑:
ps -ax | grep node
你会得到类似的东西:
8078 pts/7 Tl 0:01 node server.js
8489 pts/10 S+ 0:00 grep --color=auto node
kill -9 8078
错误EADDRINUSE
(已在使用的地址)报告本地系统上已有另一个进程占用该地址/端口。
有一个名为find-process的npm包,它有助于查找(和关闭)占用过程。
这是一个小的演示代码:
const find = require('find-process')
const PORT = 80
find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
我准备了一个小样本,可以重现EADDRINUSE
错误。如果在两个单独的终端中启动以下程序,您将看到第一个终端将启动服务器(在端口“3000”上),第二个终端将关闭已经运行的服务器(因为它阻止了第二个终端的执行, EADDRINUSE
):
最小工作范例:
const find = require('find-process')
const http = require('http')
const PORT = 3000
// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))
我更喜欢这样做
killall -15 node
因为,kill -15
为进程提供了清理自己的机会。现在,您可以通过验证
ps aux | grep node
注意:如果您没有让进程有机会完成当前正在进行的操作并进行清理,则可能会导致文件损坏
帕特里克提出的上述killall -9 node
按预期工作并解决了问题,但你可能想要阅读这个答案的编辑部分,关于为什么kill -9
可能不是最好的方法。
最重要的是,您可能希望定位单个进程,而不是盲目地杀死所有活动进程。
在这种情况下,首先获取在该端口上运行的进程的进程ID(PID)(例如8888):
lsof -i tcp:8888
这将返回如下内容:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 57385 You 11u IPv6 0xac745b2749fd2be3 0t0 TCP *:ddi-tcp-1 (LISTEN)
然后就做(ps - 实际上没有。请继续阅读下面):
kill -9 57385
你可以阅读更多关于这个here。
编辑:我今天正在阅读一个相当相关的主题,偶然发现了why should i not kill -9
a process上这个有趣的主题。
通常,你应该在kill -9之前使用kill -15来为目标进程提供一个自我清理的机会。 (进程无法捕获或忽略SIGKILL,但是它们可以并且经常捕获SIGTERM。)如果您没有给进程一个机会完成正在进行的操作和清理,它可能会留下损坏的文件(或其他状态)一旦重新启动它将无法理解。
因此,如上所述,您最好使用以下方法终止上述过程:
kill -15 57385
编辑2:由于noted in a comment around here很多次这个错误是由于没有优雅地退出进程。这意味着,很多人使用CTRL + Z退出节点命令(或任何其他命令)。停止正在运行的进程的正确方法是发出执行干净退出的CTRL + C命令。
以正确的方式退出流程将在关闭时释放该端口。这将允许您重新启动该过程,而无需在自己再次重新运行之前自行终止它。
我最近遇到了同样的问题。
这意味着该端口已被其他应用程序(快递或其他软件)使用
在我的情况下,我不小心在2个终端上运行快递,所以使用'Ctrl + C'退出终端为我修复了一些东西。 (仅从一个终端运行服务器)
希望它能帮助别人。
只是抬头,Skype有时会在端口80上侦听,因此如果您尝试从Node.js或任何其他应用程序侦听端口80,则会导致此错误。
您可以通过访问选项并单击高级 - >连接 - >使用端口80(取消此操作)来关闭Skype中的行为
附:进行此更改后,请不要忘记重新启动Skype!
您应该尝试终止正在侦听端口80的进程。
Killall会杀死所有运行的节点应用程序。你可能不想这样做。使用此命令,您只能杀死正在侦听已知端口的一个应用程序。
如果使用unix,请尝试以下命令:
sudo fuser -k 80/tcp
错误原因:您正在尝试使用繁忙的
port number
在Windows / Mac上有两种可能的解决方案可以解决此问题
视窗
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
苹果电脑
你可以试试netstat
netstat -vanp tcp | grep 3000
对于OSX El Capitan和更新版(或者如果您的netstat不支持-p),请使用lsof
sudo lsof -i tcp:3000
如果这不能解决您的问题,Mac
用户可以参考有关此问题的完整讨论Find (and kill) process locking port 3000 on Mac
视窗
set PORT=5000
苹果电脑
export PORT=5000
在控制器环境下,您可以使用:
在运行脚本之前,pkill node
应该完成这项工作。
请记住,此命令将终止所有node
进程,如果你只有一个容器只运行一个实例,那么这可能是正确的,我们你有这样的环境可以保证。
在任何其他情况下,我建议使用命令通过以编程方式查找来查找您找到的某个进程ID或名称。就像你的进程被调用一样,node-server-1你可以做pkill node-server-1
。
此资源可能有助于理解:https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
您的应用程序已在该端口8080上运行。使用此代码终止端口并再次运行代码
sudo lsof -t -i tcp:8080 | xargs kill -9
另一件可能导致此错误的事情是同一节点代码中的两个HTTP服务器。我正在更新一些Express 2到Express 3代码,并且有这个......
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
// tons of shit.
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
而且,它触发了这个错误。