阻止NodeJS程序退出

时间:2017-05-23 14:22:25

标签: node.js cron web-crawler exit serverless-architecture

我正在创建基于NodeJS的爬虫,它正在使用node-cron包,我需要阻止进入脚本退出,因为应用程序应该永远作为cron运行,并且会在某些时间段使用日志执行爬虫。

在Web应用程序中,服务器将监听并阻止终止,但在无服务器应用程序中,它将在执行所有代码后退出程序,并且不会等待crons。

我应该为此编写while(true)循环吗? 为此目的,节点中的最佳实践是什么?

提前致谢!

3 个答案:

答案 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();