【问题标题】:prevent NodeJS program from exiting防止 NodeJS 程序退出
【发布时间】:2017-10-23 13:32:41
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    根据@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();
    

    【讨论】:

      【解决方案2】:

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

      process.stdin.resume();
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 你是对的,我的 crons 没有运行,因为我为模块使用了错误的路径,虽然它默默退出并且我看不到错误,因为路径我使用的是 glob
        猜你喜欢
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2022-07-27
        • 2017-02-11
        相关资源
        最近更新 更多