风帆在没有 process.exit 的情况下降低 - 特征还是错误?
sails lowers without process.exit - feature or mistake?
我的 sails.js 应用程序在 PM2 下 运行,我希望 PM2 能够重新启动该应用程序,在崩溃的情况下它会这样做。问题是,当 sails 无法加载挂钩时,例如,如果启动时 DB 不可用,则 graceful sails.lower()
会在内部由 sails 调用,但实际节点进程不会退出(没有 process.exit()
由核心帆代码在降低后调用)。这是因为 PM2 不知道 sails 已经关闭,因此不会再次启动它。
这一切都发生在应用程序的初始引导过程中,并且在我的任何代码被调用之前发生,所以我无法控制它。
有人对我如何解决这个问题有什么建议吗?
我想我可以编写一个自定义核心挂钩,它可以挂接到 sail.on('lowered', fn)
并在接收到该事件时调用 process.exit()
。想法?
非常感谢。
Sails 在降低时不会调用 process.exit
,因为 Sails 应用程序可能已经以编程方式启动(通过 sails.lift()
或 sails.lower()
),并且以这种方式退出进程会也退出 调用 Sails 的脚本。
事实上,当事件循环中没有任何内容时,Node 脚本应该会自动退出。您可以通过使用 sails new
创建一个新的 Sails 应用程序并在该目录中创建一个测试脚本来自己验证这一点:
/* 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!');
});
});
在命令行上执行 node testscript.js
,您将看到两个日志,然后再次出现命令提示符。
所有这一切都是为了证明,如果您的应用程序 没有 降低,那是因为有什么东西阻止它这样做。最有可能的是数据库适配器。一些适配器(如 Postgres)保持 TCP 连接一段时间。如果您等待 30 秒左右,您可能会看到进程自动退出。如果 30 秒太长而无法等待,并且如果您不是 以编程方式调用 Sails,您当然可以自己调用 process.exit
。您可以等待 lower
事件,然后先给 Sails 一点时间进行清理:
sails.on('lower', function() {
// Give Sails five seconds to shut down before pulling the plug.
setTimeout(
function() { process.exit(1); },
5000
);
});
将其放入您的 config/bootstrap.js
中,您应该可以开始了。
如果您想找出实际上挂起您的进程并阻止它立即退出的原因,请尝试出色的 why-is-node-running 模块。
Note: at the time of this posting, the lower
event is incorrectly documented on Sailsjs.com as lowered
. This will be fixed ASAP.
我最终写了一个钩子来完成我需要的。钩子侦听 sails.on('lower')
(不是 'lowered',如文档所述!!)并等待可配置的时间,然后使用可配置的退出代码调用 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();
}
};
};
我的 sails.js 应用程序在 PM2 下 运行,我希望 PM2 能够重新启动该应用程序,在崩溃的情况下它会这样做。问题是,当 sails 无法加载挂钩时,例如,如果启动时 DB 不可用,则 graceful sails.lower()
会在内部由 sails 调用,但实际节点进程不会退出(没有 process.exit()
由核心帆代码在降低后调用)。这是因为 PM2 不知道 sails 已经关闭,因此不会再次启动它。
这一切都发生在应用程序的初始引导过程中,并且在我的任何代码被调用之前发生,所以我无法控制它。
有人对我如何解决这个问题有什么建议吗?
我想我可以编写一个自定义核心挂钩,它可以挂接到 sail.on('lowered', fn)
并在接收到该事件时调用 process.exit()
。想法?
非常感谢。
Sails 在降低时不会调用 process.exit
,因为 Sails 应用程序可能已经以编程方式启动(通过 sails.lift()
或 sails.lower()
),并且以这种方式退出进程会也退出 调用 Sails 的脚本。
事实上,当事件循环中没有任何内容时,Node 脚本应该会自动退出。您可以通过使用 sails new
创建一个新的 Sails 应用程序并在该目录中创建一个测试脚本来自己验证这一点:
/* 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!');
});
});
在命令行上执行 node testscript.js
,您将看到两个日志,然后再次出现命令提示符。
所有这一切都是为了证明,如果您的应用程序 没有 降低,那是因为有什么东西阻止它这样做。最有可能的是数据库适配器。一些适配器(如 Postgres)保持 TCP 连接一段时间。如果您等待 30 秒左右,您可能会看到进程自动退出。如果 30 秒太长而无法等待,并且如果您不是 以编程方式调用 Sails,您当然可以自己调用 process.exit
。您可以等待 lower
事件,然后先给 Sails 一点时间进行清理:
sails.on('lower', function() {
// Give Sails five seconds to shut down before pulling the plug.
setTimeout(
function() { process.exit(1); },
5000
);
});
将其放入您的 config/bootstrap.js
中,您应该可以开始了。
如果您想找出实际上挂起您的进程并阻止它立即退出的原因,请尝试出色的 why-is-node-running 模块。
Note: at the time of this posting, the
lower
event is incorrectly documented on Sailsjs.com aslowered
. This will be fixed ASAP.
我最终写了一个钩子来完成我需要的。钩子侦听 sails.on('lower')
(不是 'lowered',如文档所述!!)并等待可配置的时间,然后使用可配置的退出代码调用 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();
}
};
};