我有一个 Node.js 应用程序在 Digital Ocean Droplet 中的节点 v16.15.0 上运行。该应用程序使用使用 node-cron v3.0.1 包的 cron 作业来处理重要的进程。
问题:每当我部署新代码时,我发现有必要使用命令 pm2 reload my-app 重新加载(正常重启)Node.js 服务器。不幸的是,此操作会导致我的活动 cron 进程终止。有没有办法在不中断正在运行的 cron 作业的情况下执行服务器重新加载?
为了提高性能,我增加了集群的数量。然而,这种调整导致了 cron 作业重复运行多次的问题。为此我实施了
process.env.NODE_APP_INSTANCE === 0
用于初始化 crons。
感谢您提供的任何见解和指导。
我尝试了前面概述的使用 pm2 优雅重启的建议方法,但不幸的是,它没有产生预期的结果。受服务器重新启动影响的 cron 作业的问题仍然存在。任何进一步的帮助将不胜感激。
我通过更改代码中的一些内容解决了这个问题,如下所示:
process.on("SIGTERM", () => gracefull());
process.on("SIGINT", () => gracefull());
/**
* Handle graceful shutdown
*/
function gracefull() {
console.log(
"Received shutdown signal. Waiting for running jobs to complete..."
);
/* Set the flag to indicate shutdown */
myCron.isShuttingDown = true; // This will indicate that now do not execute new tasks in the cron
/* If no jobs are running, exit immediately */
if (myCron.running) {
myCron.on("cronDone", () => {
console.log("The Cron complete signal received");
process.exit(0);
});
} else {
console.log("No running jobs. Exiting gracefully.");
process.exit(0);
}
}