Skip to content

Latest commit

 

History

History
87 lines (53 loc) · 3.4 KB

03.como_sair_de_um_programa_node.md

File metadata and controls

87 lines (53 loc) · 3.4 KB

Como sair de um programa Node.js

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 do http. Você usaria http.createServer se precisasse servir seu aplicativo usando HTTPS, pois app.listen usa apenas o módulo http.

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.