12

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

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

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

提前致谢!

4

3 回答 3

24

我认为防止退出进程的最佳方法是:

process.stdin.resume();

我在这里找到了这个解决方案https://stackoverflow.com/a/14032965/2094090并且工作正常。

于 2018-06-15T09:58:48.317 回答
13

因为 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 的实际代码时,我们才能帮助您解决该问题。

于 2017-05-23T15:52:16.877 回答
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();
于 2021-03-23T19:41:26.693 回答