从外部信号中正常退出Node.js程序的最佳做法是什么?
我目前在我的代码中使用它:
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// some other closing procedures go here
process.exit( )
})
答案 0 :(得分:4)
希望这个模板有所帮助。我从Simon Holmes的“Getting MEAN”一书中得到了大部分内容。归功于他。
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');
答案 1 :(得分:3)
这完全取决于你的程序在做什么,但我会这样说:
正常关闭意味着任何“已启动”的I / O操作(例如文件读取,HTTP请求/响应等)都应该完成,但不能启动任何新的操作。所以你的关机处理程序应该阻止启动任何新操作的可能性(例如解除绑定任何端口侦听器,阻止任何新的fs调用等),确保任何当前运行的处理程序运行完成,然后退出该进程。
[编辑] 当然,如果您的应用程序不关心上述问题,那么实际上没有任何事情可做。当进程退出时,所有打开的文件/套接字句柄将自动关闭,因此泄漏的资源没有问题。