了解如何以最佳方式終止 Node.js 應用程式
有多種方式可以結束 Node.js 應用程式。
在控制台中運行程式時,可以使用 Ctrl-C
來關閉它,但我想在這裡討論的是程式化的結束。
讓我們從最極端的方式開始,並看看為什麼最好不要使用它。
process
核心模組提供了一個便捷的方法,可以讓你程式化地退出 Node.js 程式:process.exit()
。
當 Node.js 執行這一行時,進程立即被強制結束。
這意味著任何待處理的回調、任何仍在發送的網絡請求、任何檔案系統訪問或寫入到 stdout
或 stderr
的進程 - 都會立即不正常地終止。
如果對你來說這沒問題,你可以傳遞一個整數來向操作系統傳遞退出代碼:
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
是一個信號,告訴進程正常終止。這是由進程管理器(如 upstart
或 supervisord
等等)發送的信號。
你可以從程式內部的另一個函式中發送此信號:
process.kill(process.pid, 'SIGTERM')
或者從另一個正在運行的 Node.js 程式,或者從你系統上正在運行的任何其他應用程式,只要它知道你要終止的進程的進程 ID。