首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正常重启NodeJS服务器?

如何正常重启NodeJS服务器?
EN

Stack Overflow用户
提问于 2012-01-20 05:59:57
回答 3查看 16.9K关注 0票数 22

目前,我的副项目的prod环境是一个git代码库,我在其中放入一些代码,使用Ctrl-C手动终止服务器,然后手动重新启动它。

我知道这样做有很多地方不对劲。例如,如果用户仍在做一些重要的事情,而该过程正在处理敏感数据,而我却终止了它,那该怎么办呢?!

当我使用node v0.4.x时,有一个很好的Cluster模块,当应用程序处于安静状态时,它可以优雅地重新启动服务器。在v0.6.x中,集群模块被内置到节点中,但是它真的非常非常裸露,并且没有平滑重启的能力。

有人知道如何在v0.6.x中正常重启nodejs服务器吗?

EN

回答 3

Stack Overflow用户

发布于 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);
            }
        });
    }
}
票数 16
EN

Stack Overflow用户

发布于 2012-01-21 00:53:01

有一个名为Forever的模块。

可以从容地重新启动该进程。我想你可以用集群运行几个实例(每个核心上一个),并使用Forever来监控/重启它们。

这只是我发现的一个选择;我愿意接受建议!

票数 2
EN

Stack Overflow用户

发布于 2015-01-22 00:21:46

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8933982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档