我有一份每天执行的工作。我的应用程序在Heroku上运行,并且dyno每天重新启动。
所以可能发生的是,在作业执行过程中,Heroku开始重新启动dyno。
这本身不是问题,因为我每天可以开始两次工作,但是问题是当任务处于不稳定状态时在任务中间停止工作。
我现在想以某种方式将该信号发送到作业函数,以便我可以中断任何循环并以安全的方式停止函数执行。
我知道如何获得信号:
process
.on('SIGTERM', shutdown('SIGTERM'))
.on('SIGINT', shutdown('SIGINT'))
.on('uncaughtException', shutdown('uncaughtException'));
function shutdown(signal) {
console.log(`${ signal }...`);
return (err) => {
if (err) console.error(err.stack || err);
setTimeout(() => {
console.log('...waited 5s, exiting.');
process.exit(err ? 1 : 0);
}, 5000).unref();
};
}
但是如何将该信号发送到我的工作职能并安全地脱离呢?
谢谢。
答案 0 :(得分:0)
因此,我想出了最好的解决方案。
// Manage signals
let shutDownSignal = false;
process
.on('SIGTERM', shutdown('SIGTERM'))
.on('SIGINT', shutdown('SIGINT'))
.on('uncaughtException', shutdown('uncaughtException'));
function shutdown(signal) {
return (err) => {
shutDownSignal = true;
console.log(`Received signal: ${ signal }...`);
if (err) console.error(err.stack || err);
setTimeout(() => {
console.log('...waited 15s, exiting.');
process.exit(err ? 1 : 0);
}, 15000).unref();
};
}
module.exports.getShutDownSingnal = function(){ return shutDownSignal; }
然后在getShutDownSingnal()
随处可以检查是否启动了关机。
还有一件事。必须使用
将Procfile
放在应用程序根目录中
web: node index.js
(或app.js,具体取决于您使用的是什么)。
这是必要的,以便将SIGTERM和SIGKILL信号正确传输到节点(例如,如果使用npm,它将无法正确传输此信号)。有关Heroku docs
的更多信息也许这对某人有用。