终止一个Node.js应用程序有多种方法。
当在控制台中运行一个程序时,你可以用ctrl-C 来关闭它,但我想在这里讨论的是以编程方式退出。
让我们从最激烈的一种开始,看看为什么你最好不要使用它。
process 核心模块提供了一个方便的方法,允许你以编程方式从Node.js程序中退出:process.exit() 。
当Node.js运行这一行时,进程会立即被强制终止。
这意味着任何正在等待的回调,任何仍在发送的网络请求,任何文件系统访问,或写到stdout 或stderr 的进程--都将立即被不体面地终止。
如果这对你来说是好的,你可以传递一个整数,向操作系统发出退出代码的信号。
默认情况下,退出代码是0 ,这意味着成功。不同的退出代码有不同的含义,你可能想在你自己的系统中使用这些代码,让程序与其他程序交流。
你可以在nodejs.org/api/process…,阅读更多关于退出代码的内容。
你也可以设置process.exitCode 属性。
并在以后程序结束时,Node将返回该退出代码。
当所有的处理完成后,一个程序会优雅地退出。
很多时候,我们用Node启动服务器,比如这个HTTP服务器。
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
app.listen(3000, () => console.log('Server ready'))
这个程序是永远不会结束的。如果你调用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('Server ready'))
process.on('SIGTERM', () => {
server.close(() => {
console.log('Process terminated')
})
})
什么是信号?信号是一个POSIX互通系统:为了通知一个进程发生的事件而向其发送的通知。
SIGKILL 是告诉进程立即终止的信号,理想情况下,它的作用类似于 。process.exit()
SIGTERM 是告诉一个进程优雅地终止的信号。它是由进程管理器发送的信号,如 或 和其他许多信号。upstart supervisord
你可以从程序内部,在另一个函数中发送这个信号。
process.kill(process.pid, 'SIGTERM')
或者从另一个正在运行的Node.js程序,或者在你的系统中运行的任何其他应用程序,知道你想终止的进程的PID。