Como sair no Node.js


1868

Qual é o comando usado para sair? (ou seja, encerre o processo Node.js.)

Respostas:


2376

Chame o método processdo objeto global exit:

process.exit()

Dos documentos:

process.exit ([código])

Finaliza o processo com o especificado code. Se omitido, exit usa o código 'success' 0.

Para sair com um código de 'falha':

process.exit(1);

O shell que executou o nó deve ver o código de saída como 1.


5
Só quero adicionar algo. Se você estiver lidando com uma solicitação, também deverá end()solicitá-la. Caso contrário, ele simplesmente travará.
pixelfreak

126
@pixelfreak, exitnão é nada enganoso. Você está confuso sobre como o Node funciona. Pense no Node como o próprio servidor. Não é apenas acionado conforme necessário, como o PHP está dentro de um servidor web como o Apache. O Node nem precisa ter nada a ver com servidores da Web! É apenas um host para JavaScript, com algumas bacanas bibliotecas internas para fazer coisas úteis.
Brad

6
@Brad E PHP é uma linguagem de propósito geral. Não há necessidade de executá-lo mod_phpou usar o Apache. Você pode reimplementar um httpd no PHP como o nó, se realmente desejar ou usar uma abordagem mais sã / padronizada como o FastCGI, assim como você pode no nó.
binki 8/08/16

38
Observe que isso nãoprocess.exit() é recomendado , conforme descrito nesta resposta abaixo .
precisa saber é o seguinte

410

Apenas uma observação de que o uso nãoprocess.exit([number]) é uma prática recomendada .

A chamada process.exit()forçará o processo a sair o mais rápido possível, mesmo se ainda houver operações assíncronas pendentes que ainda não foram totalmente concluídas, incluindo operações de E / S para process.stdoute process.stderr.

Na maioria das situações, não é realmente necessário chamar process.exit()explicitamente. O processo Node.js será encerrado por si próprio se não houver trabalho adicional pendente no loop de eventos. A process.exitCodepropriedade pode ser configurada para informar ao processo qual código de saída usar quando o processo sair normalmente.

Por exemplo, o exemplo a seguir ilustra um uso indevido do process.exit()método que pode levar a que os dados impressos stdoutsejam truncados e perdidos:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

A razão pela qual isso é problemático é porque as gravações process.stdoutno Node.js às vezes são assíncronas e podem ocorrer em vários ticks do loop de eventos do Node.js. A chamada process.exit(), no entanto, força o processo a sair antes que essas gravações adicionais stdoutpossam ser executadas.

Em vez de chamar process.exit()diretamente, o código deve definir process.exitCodee permitir que o processo saia naturalmente, evitando agendar qualquer trabalho adicional para o loop de eventos:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}

31
Esta é a melhor resposta, de longe. Outras respostas podem não permitir nó para processar adequadamente os eventos antes de sair pendente, muito triste :(
djabraham

3
Concordado, isso deve ter mais votos positivos! Eu tinha um script de nó que estava iniciando vários processos filhos via shelljs.exec e queria que meu script geral retornasse com um código de saída de erro se algum dos processos filhos falhar. process.exitCode = 1 funcionou muito bem nos retornos de chamada exec (enquanto que simplesmente chamando process.exit (1) em haveria sair do script principal antes de todos os processos filho terminou!)
Nick

15
Eu usei essa resposta e descobri que meu processo nunca realmente saiu. Tive que pressionar Ctrl-C.
jcollum

34
Existem muitos casos de uso para processo imediato e encerramento de evento pendente. É exatamente para isso que process.exit()se destina.
Dominic Cerisano 01/01

7
Esta não é a melhor resposta, de forma alguma, porque não responde à pergunta. Em vez disso, fornece práticas recomendadas sobre como desenvolver o fluxo de código para um programa nodejs.
precisa saber é o seguinte

365

Na documentação oficial do nodejs.org :

process.exit(code)

Finaliza o processo com o código especificado. Se omitido, exit usa o código 'success' 0.

Para sair com um código de 'falha':

process.exit(1);

9
@Alison sim, ou mais precisamentecode = 0; process.exit(code);
wprl

7
É verdade que, se você está saindo, provavelmente não se importa com o valor de code?
Armand

8
@Alison A melhor idéia é apenas process.exit()com nenhum parâmetro como padrões de código para 0
Jeremy Moritz

2
@ Armand Você está correto - o código é apenas uma variável e, neste caso, usado para indicar qual é o parâmetro. Então .exit (0) faz tudo o que o exemplo faz.
precisa

23
@Armand o código não é para você, é para o que quer que tenha executado o seu código. Por exemplo, se você criar um exit_0.js process.exit(0);e executá- node exit_0.js && echo 'success'lo, ele dirá "sucesso". Se você criar exit_1.js com process.exit(1);e executar, node exit_1.js && echo 'success'ele não dirá "sucesso", pois seu processo saiu com um valor diferente de zero (o que indica uma "falha" ou "saída anormal" no shell). Além disso, você verá valores diferentes $?se executar node exit_1.jsvs node exit_0.js(você pode verificar fazendo node exit_1.jse depois fazendo echo $?).
precisa saber é

277

Se você estiver em um terminal Unix ou linha de comando do Windows e quiser sair do Node REPL, ...

  • Pressione Ctrl+ Cduas vezes ou
  • digite .exite pressione Enter ou
  • pressione Ctrl+ Dno início de uma linha (somente Unix)

14
Observe que, além do Node, o atalho Ctrl + D no Mac ou Linux funciona em quase todos os shells e REPLs que você encontrará, incluindo shells Unix como Bash, shells para bancos de dados como MySQL e PostgreSQL e os REPLs para linguagens de programação como Python, PHP e Ruby. É o único método de sair de conchas que eu já uso.
Marque Amery

2
Para o nodeREPL, Ctrl + D para sair é um comportamento padrão, portanto também funciona no Windows.
Alan

Pressione Ctrl + C (mesmo em um Mac!)
Príncipe

124

Na linha de comando, .exité o que você deseja:

$ node
> .exit
$

Está documentado nos documentos do REPL . REPL (Read-Eval-Print-Loop) é como a linha de comando do Nó é chamada.

Em um programa normal, use process.exit([code]).


79

Depende do motivo pelo qual você deseja sair do processo node.js, mas, de qualquer forma, process.exit()é a última opção a considerar . Uma citação da documentação:

É importante observar que a chamada process.exit()forçará o processo a sair o mais rápido possível, mesmo se ainda houver operações assíncronas pendentes que ainda não foram totalmente concluídas, incluindo operações de E / S para process.stdoute process.stderr.

Na maioria das situações, não é realmente necessário chamar process.exit()explicitamente. O processo Node.js será encerrado por si próprio se não houver trabalho adicional pendente no loop de eventos. A process.exitCodepropriedade pode ser configurada para informar ao processo qual código de saída usar quando o processo sair normalmente.

Vamos cobrir os possíveis motivos pelos quais você pode sair do processo node.js. e por que deve evitar process.exit():

Caso 1 - Execução concluída (script de linha de comando)

Se o script chegou ao fim e o interpretador de nó não sai, isso indica que algumas operações assíncronas ainda estão pendentes. É errado forçar o encerramento do processo process.exit()neste momento. É melhor tentar entender o que impede seu script de sair da maneira esperada . E quando você resolver isso, poderá usar process.exitCodepara retornar qualquer resultado ao processo de chamada.

Caso 2 - Terminação devido a sinal externo (SIGINT / SIGTERM / outro)

Por exemplo, se você deseja encerrar normalmente um aplicativo expresso . Diferentemente do script da linha de comando, o aplicativo expresso continua sendo executado infinitamente, aguardando novas solicitações. process.exit()será uma opção ruim aqui porque interromperá todas as solicitações que estão no pipeline. E alguns deles podem ser não-idempotentes (UPDATE, DELETE). O cliente nunca saberá se essas solicitações foram concluídas ou não no servidor e pode ser o motivo da inconsistência dos dados entre o cliente e o servidor. A única boa solução é dizer ao servidor http para parar de aceitar novos pedidos e aguardar pelos pedidos pendentes para concluir server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Se ele ainda não sair - consulte o Caso 1.

Caso 3 - Erro interno

É sempre melhor para throwum erro, você receberá um rastreamento de pilha bem formatado e uma mensagem de erro. Níveis superiores de código sempre podem decidir se podem lidar com error ( catch) ou deixar o processo travar. Por outro lado, process.exit(1)encerrará o processo silenciosamente e não haverá chance de se recuperar disso. Pode ser o único "benefício" de process.exit(), você pode ter certeza de que o processo será encerrado.


4
Resposta surpreendente. Process.exit()parece um grande exagero para a maioria dos aplicativos. Eu estava procurando por um equivalente a morrer de php function () ... mais como:throw new Error('die msg')
AvadData

Se houver um monte de código que deve ser executado continuamente até que uma solicitação de desligamento seja recebida, existe alguma convenção interessante para registrar eventos que permitiria que as assinaturas fossem abandonadas em resposta a uma solicitação de desligamento, sem que isso exigisse o código usando os eventos ou o código que solicita o desligamento tem conhecimento específico um do outro? Infelizmente, a única maneira pela qual consigo implementar isso seria exigir que qualquer parte do código que registrasse um evento também criasse um wrapper que incluísse um fechamento para cancelá-lo.
Supercat 29/03

26

REPL (linha de comando)

  • Pressione ctrl + c duas vezes

  • Digite .exite pressione enter

Arquivo de script

process.exit(code)

O nó normalmente sai com o código 0 quando não há mais operações assíncronas pendentes.

process.exit(1) deve ser usado para sair com um código de falha. Isso permitirá inferir que o nó não foi fechado normalmente e foi forçado a fechar.

Existem outros códigos de saída como

3 - Erro interno de análise de JavaScript (muito, muito raro)

5 - Erro fatal no mecanismo javascript v8

9 - Argumento inválido

Para obter uma lista completa, consulte os códigos de saída do nó


12

Eu tenho um aplicativo que eu queria:

  1. Envie um email para o usuário
  2. Sair com um código de erro

Eu tive que conectar process.exit(code)a um exitmanipulador de eventos ou o email não será enviado, pois a chamada process.exit(code)mata diretamente eventos assíncronos.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

4
Eu acho que você quer process.exitCode
Julian de Bhal

Para constar: passei boa parte do dia tentando process.exitCodetrabalhar para mim em uma ferramenta de linha de comando que estou construindo (testada no Node v4.3.0). Mas não consegui que ele se comportasse como documentado. Isso poderia muito bem ter sido um caso delicadocommander - embora github.com/tj/commander.js/… me faça pensar. Não tenho certeza se alguém lá fora viu esse problema com o nó 4, mas documentando apenas para referência futura.
Mckmcneil

re a possibilidade de isso vir do comandante, eu também olhei para seu único dep ( github.com/zhiyelee/graceful-readlink/… ), mas nenhum dado. Apenas possível culpado parece ser talvez: github.com/tj/commander.js/blob/... Especificamente, o problema é que, mesmo se você definir process.exitCode = 1, o processo será encerrado com código 0.
mikermcneil

11

Como o @Dominic apontou, lançar um erro não capturado é uma prática melhor, em vez de chamar process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
Tomado no contexto da pergunta "Como sair no Node.js", este é um conselho horrível. Sua sugestão faria muito mais sentido se a pergunta estivesse perguntando especificamente como sair por erro. Eu sugiro fortemente que você exprima sua resposta de forma a indicar que o usuário faz o que você sugere, apenas se estiver tentando sair do aplicativo em caso de erro .
Rdackhouse

@rstackhouse, eu espero que você tenha passado por atirar um erro não detectado que aponta para -> nodejs.org/api/process.html#process_process_exit_code
MANN

5
O problema com o arremesso é o feio como o inferno. Alguma dica para evitar esse rastreamento de pilha (não é relevante quando a ferramenta CLI deseja sair se o uso não estiver correto)?
MoOx

9

Sair

let exitCode = 1;
process.exit(exitCode)

Códigos de saída úteis

1 - Catchall para erros gerais
2 - Uso indevido dos componentes internos do shell (de acordo com a documentação do Bash)
126 - O comando invocado não pode ser executado
127 - “comando não encontrado”
128 - Argumento inválido para sair
128 + n - Sinal de erro fatal "n"
130 - Script finalizado por Control-C
255 \ * - Status de saída fora do intervalo


7

No código, você pode usar process.exit([errorcode])where [errorcode]é um número inteiro opcional ( 0é o padrão para indicar sucesso).

Se você estiver usando o Read Eval Print Loop (REPL) , poderá usar Ctrl+ Dou digitar.exit

Como alternativa, no Windows ou Linux, você pode usar Ctrl+ C, Ctrl+C

No Mac, o comando é Ctrl+ Z, Ctrl+Z


2
Obras Dois controle do c No Mac, também, pelo menos, nos meus com node --version v0.10.18
msouth

O Control-C não parece cancelar as operações que já foram agendadas, enquanto o ctrl-z mata o processo sem demora no Mac.
jorisw

7

Pressione Ctrl + Cduas vezes ou .exit.

> 
(To exit, press ^C again or type .exit)
> 

3

Consegui que todos os processos do meu nó morressem diretamente do shell do Git Bash no Windows 10 digitando taskkill -F -IM node.exe- isso encerra todos os processos do nó no meu computador de uma só vez. Eu descobri que eu também poderia usar taskkill //F //IM node.exe. Não sei por que ambos -e //funcionam nesse contexto. Espero que isto ajude!


Isso se deve à própria tarefa. Você está matando os próprios processos. Além disso, um único / é suficiente.
Paul Stelian

2

Como processo é objeto global, você não precisa importar nenhum módulo. A função a seguir sai ou mata o processo atual do nó.

process.exit (código)

process.kill (process.pid)

process.abort ()


1

Abra o terminal da linha de comandos em que o aplicativo do nó está em execução e pressione Ctrl + C

se você deseja sair de um aplicativo js do nó a partir do código,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

Se você deseja sair do aplicativo node js, escreva

process.exit(1)

no seu código


3
1 é usado para indicar que houve um erro no aplicativo, que as outras respostas já esclarecem.
Herick

0

A saída no nó js é feita de duas maneiras:

  • Chamando process.exit () explicitamente.
  • Ou, se o loop de eventos nodejs for feito com todas as tarefas e não houver mais nada a fazer. Em seguida, o aplicativo do nó será encerrado automaticamente.

Como funciona?

Se você deseja forçar o loop de execução a interromper o processo, você pode usar o processo de variável global , que é uma instância do EventEmitter . Então, quando você chama process.exit (), na verdade, emite a saída evento que encerra todas as tarefas imediatamente, mesmo se ainda não houver operações assíncronas.

process.exit () usa um código de saída (Inteiro) como parâmetro. O código 0 é o padrão e isso significa que ele sai com um 'sucesso'. Enquanto o código 1 significa que ele sai com uma 'falha'.


0

Se você estiver no Windows, vá para o Gerenciador de tarefas, depois para Processos, procure um processo chamado "nó", clique nele com o botão direito do mouse e, em seguida, clique na opção "Finalizar processo".


-1

Você pode usar a função process.exit ([code]) .

Se você deseja sair sem uma 'falha', use o código 0:

process.exit(0);

Para sair com um código de 'falha', 1você pode executar:

process.exit(1);

O código de 'falha' da falha é específico do aplicativo. Então você pode usar suas próprias convenções para isso.

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.