从外部信号优雅地退出 Node.js 程序的最佳实践是什么?
我目前在我的代码中使用它:
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// some other closing procedures go here
process.exit( )
})
Run Code Online (Sandbox Code Playgroud)
希望这个模板有帮助。我从西蒙福尔摩斯的书中得到了大部分内容。功劳归于他。
var mongoose = require( 'mongoose' );
var gracefulShutdown;
var dbURI = 'mongodb://localhost/xxx';
if (process.env.NODE_ENV === 'production') {
dbURI = process.env.MONGOLAB_URI;
}
mongoose.connect(dbURI);
// CONNECTION EVENTS
mongoose.connection.on('connected', function () {
console.log('Mongoose connected to ' + dbURI);
});
mongoose.connection.on('error',function (err) {
console.log('Mongoose connection error: ' + err);
});
mongoose.connection.on('disconnected', function () {
console.log('Mongoose disconnected');
});
// CAPTURE APP TERMINATION / RESTART EVENTS
// To be called when process is restarted or terminated
gracefulShutdown = function (msg, callback) {
mongoose.connection.close(function () {
console.log('Mongoose disconnected through ' + msg);
callback();
});
};
// For nodemon restarts
process.once('SIGUSR2', function () {
gracefulShutdown('nodemon restart', function () {
process.kill(process.pid, 'SIGUSR2');
});
});
// For app termination
process.on('SIGINT', function() {
gracefulShutdown('app termination', function () {
process.exit(0);
});
});
// For Heroku app termination
process.on('SIGTERM', function() {
gracefulShutdown('Heroku app termination', function () {
process.exit(0);
});
});
// TODO : For Modulus app termination
// BRING IN YOUR SCHEMAS & MODELS.
require('./yyy');
Run Code Online (Sandbox Code Playgroud)
这完全取决于你的程序正在做什么,但我会这样说:
正常关闭意味着任何“已启动”的 I/O 操作(例如文件读取、HTTP 请求/响应等)都应该完成,但不能启动新的操作。因此,您的关闭处理程序应该防止启动任何新操作的可能性(例如,取消绑定任何端口侦听器,防止任何新的 fs 调用等),确保任何当前正在运行的处理程序运行完成,然后退出该进程。
[编辑]当然,如果您的应用程序不关心上述问题,那么确实没有什么可做的。当进程退出时,所有打开的文件/套接字句柄将自动关闭,因此不存在资源泄漏的问题。