Nó / Express: EADDRINUSE, Endereço já em uso - Kill server


442

Eu tenho um servidor simples em execução no node.js usando o connect:

var server = require('connect').createServer();
//actions...
server.listen(3000);

No meu código, tenho manipuladores reais, mas essa é a ideia básica. O problema que eu continuo recebendo é

EADDRINUSE, Address already in use

Eu recebo esse erro ao executar meu aplicativo novamente depois que ele falhou anteriormente ou erros. Como não estou abrindo uma nova instância do terminal, encerro o processo com ctr + z.

Estou bastante certo de que tudo o que preciso fazer é fechar o servidor ou a conexão. Eu tentei ligar server.close()no process.on('exit', ...);sem sorte.


39
Na verdade, em vez de Ctrl + zvocê deve usar Ctrl + co que irá fechar o programa corretamente, enviando SIGQUIT :) Veja o wiki para mais detalhes :)
nacho4d

1
Você quer dizer SIGINT. SIGQUIT é devido a `ctrl + \`
Xedecimal

53
Tente pkill nodejsou pkill nodese estiver no sistema operacional UNIX-like
Gerard

1
Eu tive um problema semelhante e encontrou este pacote que irá permitir-lhe sair de forma limpa quando CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1. Parece que há um ID de processo danificado ou inoperante travado na porta, portanto, o serviço Baseado em Nó não está iniciando e exibindo o erro PORT PORT EM USO (ERRO ENDEREÇO ​​EM USO) 2. Estamos tentando descobrir como liberar o porta 10000 sem reiniciar o servidor.
abksharma

Respostas:


146

process.on('exit', ..)não é chamado se o processo travar ou for morto. Ele é chamado apenas quando o loop de eventos termina e, como server.close() meio que termina o loop de eventos (ainda precisa aguardar as pilhas atualmente em execução aqui e ali), não faz sentido colocar isso dentro do evento de saída ...

No acidente, faça process.on('uncaughtException', ..)e mateprocess.on('SIGTERM', ..)

Dito isto, o SIGTERM (sinal padrão de interrupção) deixa o aplicativo limpar, enquanto o SIGKILL (encerramento imediato) não deixa o aplicativo fazer nada.


3
é também útil ligar no process.on ('SIGINT', ...)
farincz

487

Você também pode seguir a rota da linha de comando:

ps aux | grep node

para obter os IDs do processo.

Então:

kill -9 PID

Fazer o -9 ao matar envia um SIGKILL (em vez de um SIGTERM). O SIGTERM às vezes é ignorado por nó.


1
ps aux | grep nodenão mostra nada; ainda textareaserver --editor-cmd='gvim -f'falha: 14 Mar 21:19:30 - socket.io ready - aceitando conexões Agora poderia iniciar o servidor: EADDRINUSE, Endereço já em uso
Jean Jordaan

75
Por que isso, em vez dekillall -9 node
Martin Josefsson 27/11

1
pidoftambém é útil
JVE999 30/09

25
Eu usei esta resposta por um longo tempo, então um dia compor-lo em um um forro para a conveniência .. este comando irá matar qualquer processo em execução em uma determinada porta (8000 neste exemplo): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Eu tinha vários servidores de nó em execução ao mesmo tempo, alguns deles aplicativos da Electron. Eu tive que usar apenas killcom a identificação do processo específico em vez de killall.
Tuliomir 5/01/19

225

Primeiro, você gostaria de saber qual processo está usando port 3000

sudo lsof -i :3000

isso listará todos os PIDs que estão ouvindo nessa porta, depois que você tiver o PID, poderá finalizá-lo com o seguinte:

kill -9 {PID}

17
Este comando identifica claramente o PID, diferente da saída ps aux | grep nodepara mim. Eu também não precisavasudo
Phil Gibbins

Esta é a melhor resposta. Funcionou bem para mim com a porta 8081, usando o React Native com fio.
Fernando Barbosa

Isso funcionou muito bem para mim. Eu pude identificar onde a porta 3000 foi usada e fechá-la. Eu também não precisava sudo.
Campalo

Muito bem. Eu também tentei depois de receber o comando killall -9 {COMMAND}por exemplokillall -9 node
STREET DINHEIRO

uau funcionou para mim
Anoop PS

162

Eu bati isso no meu laptop rodando win8. isso funcionou.

Execute o cmd.exe como 'Administrador':

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Eu estava executando a janela de comando e a fechei por acidente. O nó continuou em execução no segundo plano ... (mesmo após o término da sessão). No meu caso, depois que fechei a guia do navegador que estava conectada a ele por meio de soquetes da Web, ele finalmente terminou.
Bertus Kruger

6
taskkill /F /IM node.exefunciona como um encanto para mim no Windows a partir de qualquer diretório :-) Obrigado pelo compartilhamento !!
Marty McGee

2
Esta é a única solução de trabalho de uma única linha que eu tenho sido capaz de verificar para Windows
Código Whisperer

4
Funciona no Windows 10. Não precisei executar o cmd.exe como administrador.
Glenn Werner

74

Verifique o PID, ou seja, o ID do processo em execução na porta 3000 com o comando abaixo:

lsof -i tcp:3000

Seria algo parecido com o seguinte:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Agora mate o processo usando:

kill -9 5805

isso funcionou para mim ao usar o sls offline plugin.
Junaid Atique

Obrigado por isso! Comecei a aprender a reagir, como horas atrás. :) Depois de parar o servidor, eu o executei novamente, apenas para encontrar esses erros.
Glenn

Não recebo saída se usar perdido. Isso significa que não há processo nessa parte?
x89


29

Linux

Execute pse determine o PID do processo do nó.

Então corra sudo kill PID

janelas

Use a lista de tarefas para exibir a lista de processos em execução:

tasklist /O

Em seguida, mate o processo do nó da seguinte maneira (usando o PID obtido no tasklistcomando):

taskkill /pid PID

1
E se no Windows?
Trevor

1
Apenas como uma nota ... por algum motivo eu tive que usar barras duplas nas minhas bandeiras para o comando taskkill do git-bash: taskkill //IM node.exe e acabei de matar o nó. trabalhou.
Nawlbergs

23

Aqui está um liner (substitua 3000 por uma porta ou uma variável de configuração):

kill $(lsof -t -i:3000)

20

Eu estava recebendo esse erro uma vez e fiz muitas das abordagens aqui.

Meu problema era que eu tinha duas app.listen(3000);chamadas no mesmo script app.js. O primeiro app.listen () foi bem-sucedido onde o segundo causou o erro.

Outro comando útil que me deparei que me ajudou a depurar foi o sudo fuser -k 3000/tcpque matará qualquer processo invasor que você possa ter iniciado (alguns processos podem reiniciar, por exemplo, se executados com o forever.js, mas foi útil para mim).


o mesmo problema aqui ... estranho que estava funcionando corretamente na depuração enquanto recebendo este erro para corrernpm start
Asqan

16

Para o Windows, abra o Gerenciador de tarefas e encontre os processos node.exe. Mate todos eles com Finalizar tarefa.

insira a descrição da imagem aqui


1
tão fácil e não complicado para usuários do Windows
momal

Funciona. Obrigado
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Descrição:


  1. O ps fornecerá o status do processo, aux fornecerá a lista de a: todos os processos de usuários, u: processos próprios do usuário, x: todos os outros processos não conectados ao terminal.
  2. símbolo de pipe: | passará o resultado do ps aux para manipular ainda mais.
  3. O grep pesquisará a string fornecida (nó no nosso caso) na lista fornecida por ps aux.

12

Para sua informação, você pode matar o processo em um comando sudo fuser -k 3000/tcp. Isso pode ser feito para todas as outras portas como 8000, 8080 ou 9000, que são comumente usadas para desenvolvimento.



11

Primeiro descubra o que está sendo executado usando:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Você receberá algo como:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Em seguida, você pode matar o processo da seguinte maneira:

sudo kill 110

Então você poderá executar sem obter os erros listen EADDRINUSE ::: 3000


Estou usando o nodemon e ele reinicia o serviço novamente. Existe alguma maneira de matar nodemon?
amigos estão

10

Para Visual Studio Noobs como eu

Você pode estar executando o processo em outros terminais!

Depois de fechar o terminal no Visual Studio , o terminal simplesmente desaparece .

Eu manualmente criado um novo pensamento que a anterior foi destruída. Na realidade, toda vez que eu clicava no Novo Terminal , estava criando um novo em cima dos anteriores .

Então localizei o primeiro terminal e ... Voila, eu estava executando o servidor lá.

vários terminais sem perceber


1
Oh sim, meu irmão.
Jaydeep Shil

8

Gerenciador de tarefas (ctrl + alt + del) ->

Guia Processos ->

selecione o processo "node.exe" e clique em "Finalizar processo"


por que matar todo o processo do nó se o que estou procurando é matar um processo da porta do nó.
Jimmy Obonyo Abor

8

Você pode se deparar com cenários em que mesmo matar o encadeamento ou processo não termina o aplicativo (isso acontece comigo no Linux e Windows de vez em quando). Às vezes, você já pode ter uma instância em execução que não fechou.

Como resultado desses tipos de circunstâncias, prefiro adicionar ao meu package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Posso chamá-los usando:

npm run stop-win
npm run stop-Linux

Você pode ficar mais elegante e fazer esses comandos BIN com um sinalizador de argumento, se desejar. Você também pode adicioná-los como comandos a serem executados em uma cláusula try-catch.


5

Nos usuários do Windows: abra task managere end tasko nodejs.exearquivo Funciona bem.


4

Você pode usar o hot-node para impedir que o servidor trava / erros de tempo de execução. O nó quente reinicia automaticamente o aplicativo nodejs sempre que houver uma alteração no programa do nó [origem] / processo [executando o programa do nó].

Instale o nó quente usando o npm usando a opção global:

npm install -g hotnode


pm2 é uma escolha melhor. mais robusto, mais opções. e não tem o problema ao executar como root que sempre teve.
Lucas

@ Lucas O que é esse problema de raiz para sempre que você fala? Infelizmente, sou forçado a usar para sempre em vez do pm2 em um produto no trabalho (devido a alguma porcaria de licenciamento), e isso me preocupa muito!
GPX 04/02

4

Com o devido respeito a todas as respostas no formulário, gostaria de acrescentar um ponto.

Descobri que quando encerro um aplicativo de nó por erro usando Ctrl + Z, na próxima vez em que tento abri-lo, recebo o mesmo erro EADDRINUSE.

Quando uso Ctrl + C para encerrar um aplicativo de nó, na próxima vez que o abri, ele ocorreu sem problemas.

Alterar o número da porta para algo diferente do erro resolveu o problema.


1
Ctrl + C está correto. Usei o mesmo número de porta que antes e funcionou como antes.
vipulnj

2
<key> Ctrl-Z </key> não interrompe o processo. Ele o coloca em segundo plano para que você possa executar outros comandos. Isso é coisa do shell do Unix. Para continuar o processo, use fgesse mesmo console. Você pode ver o que está acontecendo nesse servidor depois de digitar vários comandos na linha de comando.
Alexis Wilke

4

No Linux.

Adicionar função a ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Puxar alterações: source ~/.bashrc

E use-o: killTcpListen 3000


3

Apenas no caso, verifique se você adicionou esta linha várias vezes por engano

app.listen(3000, function() {
  console.log('listening on 3000')
});

O código acima é para express, mas verifique se você está tentando usar a mesma porta duas vezes no seu código.


3

Win10, git bash v2.15, nó v8.9.1, npm v5.5.1

Eu tinha um script package.json para iniciar o nó: "start": "node index.js"

Sempre que eu usava isso, independentemente de matá-lo com ctrl + c, encontrava esse problema.

Se eu apenas corri node index.jsdo git bash em vez de o npm run startmatar com ctrl + c, nunca recebi esse erro.

Não sei por que, mas achei que isso poderia ajudar alguém.


1
Estou recebendo o mesmo problema com essencialmente a mesma configuração. no meu caso, notei que a execução de um aplicativo expresso através do npm gera dois processos, mas apenas um é fechado ao usar ctrl + c. ao iniciar o aplicativo com apenas um nó, apenas um processo é aberto e fecha corretamente.
WORC

1
esse problema do git para windows está meio que lançando luz sobre a coisa toda. parece que pode haver um bug em algum lugar entre a dependência do hortelã e a do cygwin.
WORC

3

Solução de interface do usuário Para usuários do Windows: descobri que as principais respostas não funcionavam para mim, pareciam comandos para usuários de Mac ou Linux. Encontrei uma solução simples que não exigia nenhum comando para ser lembrado: abra o Gerenciador de tarefas (ctrl + shift + esc). Veja os processos em segundo plano em execução. Encontre qualquer coisa Node.js e termine a tarefa.

Depois que fiz isso, o problema desapareceu para mim. Conforme declarado em outras respostas, são processos em segundo plano que ainda estão em execução porque um erro foi encontrado anteriormente e as funções regulares de saída / limpeza não foram chamadas, portanto, uma maneira de matá-las é encontrar o processo no Gerenciador de Tarefas e matá-lo lá . Se você executou o processo em um terminal / powerShell, geralmente pode usar ctrl + c para matá-lo.


Sim, certo, obrigado por você responder
DINA TAKLIT

3

Reescrevendo o comentário de @Gerard na minha resposta:

Experimente pkill nodejsou pkill nodese estiver no sistema operacional UNIX .

Isso interromperá o processo que está executando o servidor do nó em qualquer porta. Trabalhou para mim.

Namaste🙏


2

O nó está sendo executado em algum lugar na memória e tem essa porta bloqueada. No Windows, esse problema acontecerá, como a maioria dos problemas do Windows, será resolvido pressionando CTRL+ ALT+ DELe / ou reiniciando.


Esta pergunta responde a muitas outras perguntas. Desligue-o e ligue-o novamente. Gênio.
datUser

1

Os motivos para esses problemas são:

  1. Qualquer aplicativo pode estar em execução nessa porta como o Skype.
  2. O nó pode ter travado e a porta pode não ter sido liberada.
  3. Você pode ter tentado iniciar o servidor mais de um. Para resolver esse problema, é possível manter um booleano para verificar se o servidor foi iniciado ou não. Ele deve ser iniciado apenas se o retorno booleano for falso ou indefinido;

1

server.close () demora um pouco para fechar a conexão, portanto, devemos fazer desta uma chamada assíncrona como tal:

await server.close();

IMPORTANTE: ao usar wait , devemos usar a palavra - chave assíncrona em nossa função de encapsulamento da seguinte forma:

async () => {
  await server.close();
}

1

Use o comando abaixo no terminal / cmd para alterar a porta (npm run dev é para node.js). Você pode ter outros comandos para executar seu aplicativo, a maioria deles funcionará ao alterar a porta, mais fácil e mais rápido. Além disso, você pode usar qualquer número de porta gratuito em seu sistema, em vez de 3002

PORT=3002 npm run dev

Na maioria das vezes, quando alguém executa o projeto enquanto sai, pressiona-se abruptamente ou sem o controle + z que permite sair da porta, vá sempre para o controle + c que não sai da porta para executar o servidor ou projeto.

Além disso, é hora de alterar o número da porta no seu código

server.listen(3002);

0

Isso significa que você tem dois servidores de nó em execução na mesma porta, se um estiver em execução na porta, digamos 3000, altere o outro para outra porta, digamos 3001 e tudo funcionará bem

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.