Pare o programa node.js na linha de comandos

304

Eu tenho um servidor TCP simples que escuta em uma porta.

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

Começo com ele node server.jse depois o fecho com Ctrl + Z no Mac. Quando tento executá-lo novamente node server.js, recebo esta mensagem de erro:

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)

Estou fechando o programa da maneira errada? Como posso impedir que isso aconteça?

Eleeist
fonte
2
Provavelmente vale a pena acrescentar que Ctrl-Z suspende um comando no * NIX e não o fecha. Se você digitar fgapós Ctrl-Z, estará de volta de onde parou. Portanto, seu nó anterior ainda está em execução. Cuidado se você estiver fazendo isso com outros comandos também!
Ruffin
1
@ ruffin isso deve ser uma resposta. Se você executou a Ctrl+Zação, uma metodologia adequada poderia ser fgreviver o processo e depois Ctrl+Cmatá-lo adequadamente.
Metagrafista

Respostas:

393

Para finalizar o programa, você deve usar Ctrl+ C. Se você fizer isso, ele envia SIGINT, o que permite que o programa termine normalmente, desatando-se de qualquer porta em que estiver ouvindo.

Veja também: https://superuser.com/a/262948/48624

Brad
fonte
21
Ctrl + CNao funciona para mim. Somente ^Cé digitado no console e o programa não sai.
Eleeist
1
@Eleeist, o que você está usando como terminal? Funciona muito bem para mim.
Brad
2
@ Eleeist, você provavelmente reformou suas chaves ou algo assim. Ctrl+Cfunciona bem. De qualquer forma, esse é um problema separado do seu problema real. Você deve postar uma pergunta "Ctrl + C não funciona" no SuperUser.com.
Brad
1
@ jt0dd Você poderia sempre kill -9, mas eu não faria. Você realmente tem certeza de que seu aplicativo ainda é aquele que mantém as portas abertas? Eu nunca tive esse problema. Assim que meu aplicativo termina, as conexões são sempre imediatamente encerradas. Eu usaria o netstat para determinar se seu aplicativo ou outra coisa está demorando nessa porta.
22414 Brad
1
Eu enfrentei esse problema quando estava usando o tipo de teclado em outro idioma. Certifique-se de que o idioma de entrada do seu Mac seja o inglês
Fa.Shapouri
325

Ctrl+ Zsuspende, o que significa que ainda pode estar em execução.

Ctrl+ Cirá realmente matá-lo.

você também pode matá-lo manualmente assim:

ps aux | grep node

Encontre o ID do processo (segundo da esquerda):

kill -9 PROCESS_ID

Isso também pode funcionar

killall node
Jamund Ferguson
fonte
ctrl + c funcionará, mas nenhum desses comandos funcionará para mim. Não sei porque? E eu estou procurando uma solução de linha de comando
kiwi irritado
7
Tenha cuidado com o nó killall, que você pode matar processo, você não iria querer matar se eles combinam "nó"
Samuel Bolduc
1
você pode querer mover-se killall nodeem sua resposta, uma vez que é realmente a opção mais fácil e confiável (contanto que você está ok com a matança de todas as instâncias)
Boern
4
'killall' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote. Estou esquecendo de algo?
Ayyash #
O mesmo aqui ... Sem resposta? Diz que 'killall' não é reconhecido. Nenhum dos outros comandos também funciona. Preciso reiniciar meu computador ou o quê?
Methodician
37

Ou, como alternativa, você pode fazer tudo isso em uma linha:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

Você pode substituir o nó dentro de '\ snode \ s' por qualquer outro nome de processo.

Hamid Tavakoli
fonte
2
Como alternativa, você sempre pode tentar: ps -ef | grep "nó" | awk '{print $ 2}' | xargs kill -9
frymaster
Parece funcionar, mas não me retorna corretamente a um prompt. Pensamentos?
Advogado do
25

Continue e finalize o processo:

Ctrl+ Zsuspende, o que significa que ainda está sendo executado como um processo em segundo plano suspenso.

Você provavelmente está agora em um prompt do terminal ...

  1. Dê o comando fgpara retomar o processo em primeiro plano.

  2. digite Ctrl+ Cpara matá-lo corretamente.


Como alternativa, você pode matá-lo manualmente assim:

( NOTA: os seguintes comandos podem exigir root, assim sudo ...como seu amigo)

pkill -9 node

ou, se você não tiver pkill, isso pode funcionar:

killall node

ou talvez isso:

kill $(ps -e | grep node | awk '{print $1}')

Às vezes, o processo listará seu próprio grep; nesse caso, você precisará:

kill $(ps -e | grep dmn | awk '{print $2}')

.


h / t @ruffin a partir dos comentários sobre a pergunta em si. Eu tive o mesmo problema e o comentário dele me ajudou a resolvê-lo.

Metagrapher
fonte
22

você pode digitar .exit para sair do nó js REPL

sunny1304
fonte
2
Isso pressupõe que você esteja no REPL, para começar. E se eu tiver um script Node em execução?
IgorGanapolsky
18

Se você estiver executando o Node.js interativamente (o REPL):

Ctrl+ Co levará de volta para> prompt e digite:

process.exit()

ou apenas use Ctrl+ D.

sr77in
fonte
17

$ sudo killall nodeem outro terminal funciona no mac , enquanto killall nodenão está funcionando:

$ killall node
No matching processes belonging to you were found
Maxim Yefremov
fonte
13

no linux tente: pkill node

no windows:

Taskkill /IM node.exe /F

ou

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
Jason
fonte
5

Embora essa seja uma resposta tardia, achei isso nos documentos do NodeJS :

O evento 'exit' é emitido quando o REPL é encerrado, recebendo o .exitcomando como entrada, o usuário pressionando <ctrl>-Cduas vezes para sinalizar SIGINT ou pressionando <ctrl>-Dpara sinalizar 'end' no fluxo de entrada. O retorno de chamada do ouvinte é chamado sem argumentos.

Para resumir, você pode sair por:

  1. Digitando .exitnodejs REPL.
  2. Pressionando <ctrl>-Cduas vezes.
  3. pressionando <ctrl>-D.
  4. process.exit(0)o que significa uma saída natural do REPL. Se você deseja retornar qualquer outro status, pode retornar um número diferente de zero.
  5. process.kill(process.pid) é a maneira de matar usando a nodejs api de dentro do seu código ou do REPL.
randominstanceOfLivingThing
fonte
5

Estou adicionando esta resposta porque, para muitos projetos com implantações de produção, temos scripts que interrompem esses processos e não precisamos.

Uma maneira limpa de gerenciar seus processos do Node Server é usando o foreverpacote (de NPM).

Exemplo:

Instale para sempre

npm install forever -g

Executar servidor do nó

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Resultado:

info: Forever processing file: server.js

Servidor do nó de desligamento

forever stop server.js

Resultado

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

Isso encerrará o aplicativo do servidor de forma limpa.

Decodificado
fonte
3

Se você deseja parar seu servidor npm stopou algo parecido com isto. Você pode escrever o código que interrompe o processo do servidor como:

require('child_process').exec(`kill -9 ${pid}`)

Verifique este link para obter detalhes: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

BigEgg
fonte
2

Encontrei um problema em que havia vários servidores de nó em execução e quero matar um deles e reimplementá-lo a partir de um script.

Nota: Este exemplo está em um shell bash no Mac.

Para fazer isso, certifique-se de fazer minha nodeligação o mais específica possível. Por exemplo, em vez de ligar node server.jsdo diretório de aplicativos, eu chamonode app_name_1/app/server.js

Então eu posso matá-lo usando:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

Isso matará apenas o processo do nó executando app_name_1 / app / server.js.

Se você executou node app_name_2/app/server.jsesse nó, o processo continuará sendo executado.

Se você decidir matá-los, poderá usá-los killall nodecomo outros já mencionaram.

bapin93
fonte
2

Resposta tardia, mas no Windows, abrir o gerenciador de tarefas com CTRL + ALT + DEL e depois matar os processos Node.js. solucionará esse erro.

Robert Molina
fonte
2

você pode trabalhar com o seguinte comando para ser específico no kill localserver (aqui: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

Ele fornecerá os seguintes grupos de TCPs:

COMANDO PID USUÁRIO FD TIPO DISPOSITIVO TAMANHO / DESLIGADO NOME DO NÓ

nó 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)

$:kill -9 21521

Ele matará processId correspondente ao TCP *: 8000

Ank_247shbm
fonte
2

Para MacOS

  1. Terminal aberto
  2. Execute o código abaixo e pressione Enter

     sudo kill $(sudo lsof -t -i:4200)
Siddhant Senapati
fonte
2

Você pode usar o fusor para obter o que deseja fazer.

Para obter os IDs de processo das tarefas em execução em uma porta, você pode:

fuser <<target_port>>/tcp

Digamos que a porta seja 8888, o comando se torna:

fuser 8888/tcp

E para matar um processo que está sendo executado em uma porta, basta adicionar a opção -k.

fuser <<target_port>>/tcp -k

Exemplo (a porta é 8888):

fuser 8888/tcp -k

É isso aí! Ele fechará o processo de escuta na porta. Eu costumo fazer isso antes de executar meu aplicativo de servidor.

Vikram Bankar
fonte
1

Meu caso de uso: no MacOS , execute / execute novamente vários servidores de nó em portas diferentes de um script

executar :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

stop2, stop3 ...

executar novamente :"stop1 & stop2 & ... & stopN ; run

para obter mais informações sobre como localizar um processo por uma porta: Quem está ouvindo uma determinada porta TCP no Mac OS X?

Edan Chetrit
fonte
0

No Windows, procure primeiro o PID com o número da sua porta

netstat -ano | findStr "portNumber"

Depois disso, mate a tarefa, verifique se você está na raiz do seu drive "c" insira a descrição da imagem aqui E o comando serátaskkill /F /PID your pid

gem007bd
fonte
0

se você estiver usando o código VS e o terminal, selecione o nó no menu suspenso do lado direito primeiro e depois pressione Ctrl + C. Então funcionará

insira a descrição da imagem aqui

Pressione y quando solicitado.

insira a descrição da imagem aqui

obrigado

MindRoasterMir
fonte