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

Ehe*_*Tov 6 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( )
})
Run Code Online (Sandbox Code Playgroud)

cho*_*Bao 5

希望这个模板有帮助。我从西蒙福尔摩斯的书中得到了大部分内容。功劳归于他。

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)


mae*_*ics 3

这完全取决于你的程序正在做什么,但我会这样说:

正常关闭意味着任何“已启动”的 I/O 操作(例如文件读取、HTTP 请求/响应等)都应该完成,但不能启动新的操作。因此,您的关闭处理程序应该防止启动任何新操作的可能性(例如,取消绑定任何端口侦听器,防止任何新的 fs 调用等),确保任何当前正在运行的处理程序运行完成,然后退出该进程。

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