Como sair de um programa Node.js

Há várias maneiras de finalizar uma aplicação Node.js.

Com o programa rodando no console, você pode fechá-lo com ctrl-C, mas o que queremos discutir aqui é a maneira programática de fazer isso.

Vamos começar com a maneira mais drástica, e note porque é melhor você não utilizá-la:

O módulo nativo process provê um método prático que permite a você, programaticamente, sair de um programa Node.js: process.exit().

Quando o Node.js executa essa linha, o processo é forçado a terminar imediatamente.

Isso significa que qualquer callback pendente, qualquer request de rede sendo enviada, qualquer acesso ao filesystem, ou processos de escrita no stdout ou stderr - tudo será finalizado de imediato desgraciadamente.

Se isso está bem para você, basta passar um inteiro que sinalize o código de saída para o sistema operacional:

process.exit(1)

Por padrão, o código de saída é 0, que significa sucesso. Códigos de saída diferentes tem significados diferentes, que você pode querer utilizar no seu sistema para se comunicar com outros programas.

Você pode ler mais sobre os códigos de saída em https://nodejs.org/api/process.html#process_exit_codes;

Você também pode definir a propriedade process.exitCode como:

process.exitCode = 1

e quando o programa for encerrado posteriormente, o Node.js retornará esse código de saída.

Um programa irá sair graciosamente quando todos os processos estiverem completos.

Muitas vezes nós iniciamos servidores Node.js, como esse servidor HTTP:

const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
app.listen(3000, () => console.log('Server ready'))

Esse programa nunca terá um fim. Se você chamar process.exit(), qualquer requisição corrente/pendente será abortada. Isso não é legal.

Nesse caso, você precisa enviar ao comando um sinal de SIGTEM, e lidar com o processo desse sinal:

Nota: process não requer importação, 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? Sinais são um sistema de intercomunicação POSIX: uma notificação enviada para um processo com o objetivo de notificar que um evento ocorreu.

  • SIGKILL é o sinal que diz ao processo para que finalize imediatamente, e agirá idealmente como o process.exit().
  • SIGTERM é o sinal que diz ao processo para que termine graciosamente. É o sinal que é enviado por generenciadores de processo como upstart ou supervisord e muitos outros.

Você pode enviar esse sinal por dentro da aplicação, em outra função:

process.kill(process.pid, 'SIGTERM')

ou de outro programa Node.js em execução, ou qualquer outra aplicação rodando em seu sistema que saiba o PID do processo que você deseja fianlizar.