帆没有process.exit降低 - 功能或错误?

时间:2016-10-11 13:02:35

标签: sails.js pm2 sails-mongo

我的sails.js应用程序在PM2下运行,我希望PM2能够重启应用程序,它会在崩溃时执行。问题是,当sails无法加载钩子时,例如,如果DB在启动时不可用,则优雅的sails.lower()由sails内部调用,但实际的节点进程不会退出(no {{通过核心风帆代码降低后调用1}}。这导致PM2不知道风帆已关闭,因此不会再次启动它。

这一切都发生在应用程序的初始引导中,并且在我的任何代码被调用之前,所以我无法控制它。

有人对我如何解决这个问题有任何建议吗?

我认为我可以编写一个自定义核心挂钩,可以挂钩process.exit()并在接收到该事件时调用sail.on('lowered', fn)。想法?

非常感谢。

2 个答案:

答案 0 :(得分:2)

我最终写了一个钩子来完成我需要的东西。钩子监听sails.on('lower')(不像文档说的那样“降低”!!)并等待可配置的时间然后用可配置的退出代码调用process.exit()

如果其他人需要它,请创建以下api/hooks/exitOnLower.js文件...

module.exports = function (sails) {

    return {
        defaults: {
            __configKey__: {
                name  : 'exitOnlower',
                wait  : 10000,
                active: true,
                // exitCode : 2
            }
        },

        initialize: function (cb) {

            var active   = sails.config[this.configKey].active;
            var timeout  = sails.config[this.configKey].wait;
            var exitCode = sails.config[this.configKey].exitCode;

            if (!active) {
                return cb();
            }

            sails.on('lower', function () {
                sails.log.verbose("[hook:killOnLower] Sails lower detected, exiting in %sms...", timeout);
                setTimeout(function () {
                    sails.log.warn("[hook:killOnLower] exiting app");
                    process.exit(exitCode ? exitCode : null);
                }, timeout)
            });

            return cb();
        }
    };
};

答案 1 :(得分:1)

Sails在降低时不会调用compose,因为Sails应用程序可能已经以编程方式(通过process.exitsails.lift())启动,并且以这种方式退出进程将退出调用的脚本也是如此。

事实是,当事件循环中没有任何内容时,Node脚本应该自动退出。您可以通过使用sails.lower()创建新的Sails应用程序并在该目录中创建测试脚本来自行验证:

sails new

在命令行上执行/* testscript.js */ var Sails = require('sails'); Sails.load({hooks: {grunt: false, views: false}}, function(err) { console.log('lifted sails!'); Sails.lower(function(err) { console.log('lowered sails!'); }); }); ,您将看到两个日志,然后再次显示命令提示符。

所有这一切都是为了证明如果你的应用降低,那是因为有些东西让它不这样做。最可能的事情是数据库适配器。一些适配器(如Postgres)保持TCP连接一段时间。如果等待30秒左右,您可能会看到该过程自动退出。如果30秒太长而无法等待,并且如果您以编程方式调用Sails,您当然可以自己致电node testscript.js。您可以等待process.exit事件,然后给Sails一些时间来清理:

lower

把它放在你的sails.on('lower', function() { // Give Sails five seconds to shut down before pulling the plug. setTimeout( function() { process.exit(1); }, 5000 ); }); 中,你应该好好去。

如果您想了解实际上暂停了您的流程并阻止其立即退出,请尝试使用优秀的why-is-node-running模块。

  

注意:在发布此消息时,config/bootstrap.js事件在Sailsjs.com上被错误地记录为lower。这将尽快修复。