我正在创建基于NodeJS的爬虫,它正在使用node-cron
包,我需要阻止进入脚本退出,因为应用程序应该永远作为cron运行,并且会在某些时间段使用日志执行爬虫。
在Web应用程序中,服务器将监听并阻止终止,但在无服务器应用程序中,它将在执行所有代码后退出程序,并且不会等待crons。
我应该为此编写while(true)
循环吗?
为此目的,节点中的最佳实践是什么?
提前致谢!
答案 0 :(得分:6)
因为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的实际代码时,我们才能帮助您解决该问题。
答案 1 :(得分:3)
我认为防止退出流程的最佳方法是:
process.stdin.resume();
我在这里找到了这个解决方案https://stackoverflow.com/a/14032965/2094090,它运行正常。
答案 2 :(得分:0)
根据@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();