目前,我的副项目的prod环境是一个git代码库,我在其中放入一些代码,使用Ctrl-C手动终止服务器,然后手动重新启动它。
我知道这样做有很多地方不对劲。例如,如果用户仍在做一些重要的事情,而该过程正在处理敏感数据,而我却终止了它,那该怎么办呢?!
当我使用node v0.4.x时,有一个很好的Cluster模块,当应用程序处于安静状态时,它可以优雅地重新启动服务器。在v0.6.x中,集群模块被内置到节点中,但是它真的非常非常裸露,并且没有平滑重启的能力。
有人知道如何在v0.6.x中正常重启nodejs服务器吗?
发布于 2012-06-12 21:30:11
您可以在节点代码中处理POSIX信号。
参见示例代码中的,它将SIGINT (例如Ctrl-C)处理为所有集群工作进程的停止信号,而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(){
sigkill = 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);
}
});
}
}
发布于 2012-01-21 00:53:01
发布于 2015-01-22 00:21:46
还有一个名为PM2的模块。它有能力停止集群中的所有进程。
https://stackoverflow.com/questions/8933982
复制相似问题