从外部信号中正常关闭Node.js程序的最佳做法是什么?

时间:2012-02-15 18:45:12

标签: node.js

从外部信号中正常退出Node.js程序的最佳做法是什么?

我目前在我的代码中使用它:

process.on( 'SIGINT', function() {
  console.log( "\ngracefully shutting down from  SIGINT (Crtl-C)" )
  // some other closing procedures go here
  process.exit( )
})

2 个答案:

答案 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调用等),确保任何当前运行的处理程序运行完成,然后退出该进程。

[编辑] 当然,如果您的应用程序不关心上述问题,那么实际上没有任何事情可做。当进程退出时,所有打开的文件/套接字句柄将自动关闭,因此泄漏的资源没有问题。