了解如何以最佳方式終止 Node.js 應用程式

有多種方式可以結束 Node.js 應用程式。

在控制台中運行程式時,可以使用 Ctrl-C 來關閉它,但我想在這裡討論的是程式化的結束。

讓我們從最極端的方式開始,並看看為什麼最好不要使用它。

process 核心模組提供了一個便捷的方法,可以讓你程式化地退出 Node.js 程式:process.exit()

當 Node.js 執行這一行時,進程立即被強制結束。

這意味著任何待處理的回調、任何仍在發送的網絡請求、任何檔案系統訪問或寫入到 stdoutstderr 的進程 - 都會立即不正常地終止。

如果對你來說這沒問題,你可以傳遞一個整數來向操作系統傳遞退出代碼:

process.exit(1)

默認的退出代碼是 0,表示成功。不同的退出代碼有不同的含義,你可能想在自己的系統中使用它們來使程式與其他程式通信。

你可以在 https://nodejs.org/api/process.html#process_exit_codes 中閱讀更多有關退出代碼的信息。

你也可以設定 process.exitCode 屬性:

process.exitCode = 1

當程式最終結束時,Node 會返回該退出代碼。

程式將在所有處理完成後正常退出。

在 Node 中,我們經常開始伺服器,就像這個 HTTP 伺服器一樣:

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hi!')
})

app.listen(3000, () => console.log('伺服器已啟動'))

這個程式永遠不會結束。如果你調用 process.exit(),任何當前待處理或正在運行的請求都會被中止。這是不好的

在這種情況下,你需要向程式發送 SIGTERM 信號,並使用進程信號處理器來處理它:

注意:process 不需要使用 “require”,它自動可用。

const express = require('express')

const app = express()

app.get('/', (req, res) => {
  res.send('Hi!')
})

const server = app.listen(3000, () => console.log('伺服器已啟動'))

process.on('SIGTERM', () => {
  server.close(() => {
    console.log('進程已終止')
  })
})

什麼是信號?信號是一種 POSIX 程式間通信系統:用於通知進程發生的事件。

SIGKILL 是一個信號,告訴進程立即終止,理想情況下應該像 process.exit() 一樣運作。

SIGTERM 是一個信號,告訴進程正常終止。這是由進程管理器(如 upstartsupervisord 等等)發送的信號。

你可以從程式內部的另一個函式中發送此信號:

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

或者從另一個正在運行的 Node.js 程式,或者從你系統上正在運行的任何其他應用程式,只要它知道你要終止的進程的進程 ID。