我正在创建基于 NodeJS 的爬虫,它正在使用node-cron
包,我需要防止入口脚本退出,因为应用程序应该作为 cron 永久运行,并且会在特定时间段使用日志执行爬虫。
在 Web 应用程序中,服务器会监听并阻止终止,但在无服务器应用程序中,它会在所有代码执行完毕后退出程序,并且不会等待 crons。
我应该while(true)
为此编写循环吗?为此目的,节点的最佳实践是什么?
提前致谢!
我正在创建基于 NodeJS 的爬虫,它正在使用node-cron
包,我需要防止入口脚本退出,因为应用程序应该作为 cron 永久运行,并且会在特定时间段使用日志执行爬虫。
在 Web 应用程序中,服务器会监听并阻止终止,但在无服务器应用程序中,它会在所有代码执行完毕后退出程序,并且不会等待 crons。
我应该while(true)
为此编写循环吗?为此目的,节点的最佳实践是什么?
提前致谢!
我认为防止退出进程的最佳方法是:
process.stdin.resume();
我在这里找到了这个解决方案https://stackoverflow.com/a/14032965/2094090并且工作正常。
因为 nodejs 是单线程的,所以while(true)
不会工作。它只会抢占整个 CPU,而其他任何东西都无法运行。
当将来可能运行的任何东西还活着时,nodejs 将保持运行。这包括打开的 TCP 套接字、侦听服务器、计时器等......
为了更具体地回答,我们需要查看您的代码并了解它是如何使用 node-cron 的,但是您可以通过添加setInterval()
如下简单的内容来保持 nodejs 进程运行:
setInterval(function() {
console.log("timer that keeps nodejs processing running");
}, 1000 * 60 * 60);
但是,node-cron 本身使用计时器,因此如果您正确使用 node-cron 并且您正确地安排了将来运行的任务,那么您的 nodejs 进程不应该停止。所以,我怀疑你真正的问题是你没有正确地用 node-cron 为未来安排一个任务。仅当您向我们展示使用 node-cron 的实际代码时,我们才能帮助您解决该问题。
以@jfriend00 的回答为基础,我这样做了,所以它是可以杀死的
var running = true;
function killProcess() {
running = false;
}
process.on('SIGTERM', killProcess);
process.on('SIGINT', killProcess);
process.on('uncaughtException', function(e) {
console.log('[uncaughtException] app will be terminated: ', e.stack);
killProcess();
});
function run() {
setTimeout(function() {
if (running) run();
}, 10);
}
run();