如何正常重启NodeJS服务器?

目前,我的一个侧面项目的产品环境是一个git仓库,在这里我拉入一些代码,用Ctrl-C手工杀死服务器,然后手动重新启动。

我意识到这有很多错误的东西。 比如,如果一个用户还在做重要的事情,而且这个过程正在处理敏感数据,那么我又杀了谁?

当我使用节点v0.4.x时,有一个很好的集群模块可以在应用处于完全状态时正常重启服务器。 在v0.6.x中,集群模块被内置到节点中,但它确实是裸露的,并且没有优雅的重启能力。

任何人都知道我可以在v0.6.x中正常重启nodejs服务器吗?

您可以在节点代码中处理POSIX信号。

请参阅示例代码,它将处理SIGINT(例如Ctrl-C)作为所有群集工作人员的STOP信号,SIGUSR2将重新启动所有工作人员

因此,发出kill -SIGUSR2 PID ,其中PID是节点主机PID将重新启动所有群集

 module.exports = function(app) { var cluster = require('cluster'); var numCPUs = require('os').cpus().length; var workerList = new Array(); var sigkill = false; if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { var env = process.env; var worker = cluster.fork(env); workerList.push(worker); } process.on('SIGUSR2',function(){ console.log("Received SIGUSR2 from system"); console.log("There are " + workerList.length + " workers running"); workerList.forEach(function(worker){ console.log("Sending STOP message to worker PID=" + worker.pid); worker.send({cmd: "stop"}); }); }); process.on('SIGINT',function(){ sigint = true; process.exit(); }); cluster.on('death', function(worker) { if (sigkill) { logger.warn("SIGKINT received - not respawning workers"); return; } var newWorker = cluster.fork(); console.log('Worker ' + worker.pid + ' died and it will be re-spawned'); removeWorkerFromListByPID(worker.pid); workerList.push(newWorker); }); } else { process.on('message', function(msg) { if (msg.cmd && msg.cmd == 'stop') { console.log("Received STOP signal from master"); app.close(); process.exit(); } }); app.listen(3000); } function removeWorkerFromListByPID(pid) { var counter = -1; workerList.forEach(function(worker){ ++counter; if (worker.pid === pid) { workerList.splice(counter, 1); } }); } } 

有一个名为Forever的模块。

这可以适度地重新启动过程。 我想你可以以某种方式运行几个集群(每个核心上一个)的实例,并使用Forever来监视/重新启动它们。

这只是我find的select; 我接受build议!

还有一个名为PM2的模块。 它有能力停止群集中的所有进程。

Interesting Posts