Existem varias maneiras de encerrar um aplicativo Node.js.
Ao executar um programa no console, você pode fechá-lo com Ctrl-C
, mas o que queremos discutir aqui é sair programaticamente.
Vamos começar com o mais drástico e ver por que é melhor não usá-lo.
O módulo process core
fornece um método prático que permite que você saia programaticamente de um programa Node.js: process.exit()
.
Quando o Node.js executa esta linha, o processo é imediatamente forçado a terminar.
Isso significa que qualquer retorno de chamada pendente, qualquer solicitação de rede ainda sendo enviada, qualquer acesso ao sistema de arquivos ou processos gravando em stdout
ou stderr
- tudo será encerrado imediatamente.
Se isso for bom para você, você pode passar um número inteiro que sinaliza ao sistema operacional o código de saída:
process.exit();
Por padrão, o código de saída é 0
, o que significa sucesso. Códigos de saída diferentes têm significados diferentes, que você pode usar em seu próprio sistema para que o programa se comunique com outros programas.
Você pode ler mais sobre códigos de saída em https://nodejs.org/api/process.html#process_exit_codes
Você também pode definir a propriedade process.exitCode
:
process.exitCode = 1;
e quando o programa terminar, o Node.js retornará esse código de saída.
Um programa será encerrado normalmente quando todo o processamento estiver concluído.
Muitas vezes com o Node.js iniciamos servidores, como este servidor HTTP:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hi!');
})
app.listen(3333, () => console.log('Server ready!'));
Express é uma estrutura que usa o módulo
http
por baixo dos panos,app.listen()
retorna uma instância dohttp
. Você usariahttp.createServer
se precisasse servir seu aplicativo usando HTTPS, poisapp.listen
usa apenas o módulohttp
.
Este programa nunca vai acabar. Se você chamar process.exit()
, qualquer solicitação pendente ou em execução será abortada. Isso não é legal.
É melhor permitir que a solicitação em execução seja concluída antes de encerrar. Nesse caso, você precisa enviar ao comando um sinal SIGTERM
e lidar com isso com o manipulador de processo de sinal:
Nota: o processo não requer um "require", está disponível automaticamente.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hi!');
});
const server = app.listen(3000, () => console.log('Server ready'));
process.on('SIGTERM', () => {
server.close(() => {
console.log('Process terminated');
});
});
O que são sinais? Os sinais são um sistema de intercomunicação POSIX: uma notificação enviada a um processo para notificá-lo de um evento ocorrido.
SIGKILL
é o sinal que diz a um processo para terminar imediatamente, e idealmente agiria como process.exit()
.
SIGTERM
é um sinal que diz a um processo para terminar normalmente. É o sinal que é enviado por gerentes de processos, como o upstart
ou o supervisord
e muitos outros.
Você pode enviar este sinal dentro do programa, em outra função:
process.kill(process.pid, 'SIGTERM');
Ou de outro programa em execução Node.js ou qualquer outro aplicativo em execução em seu sistema que conheça o PID do processo que você deseja encerrar.