防止 NodeJS 程序退出
prevent NodeJS program from exiting
我正在创建基于 NodeJS 的爬虫,它与 node-cron
包一起工作,我需要防止入口脚本退出,因为应用程序应该 运行 永远作为 cron 并且将在特定时期执行爬虫日志。
在 web 应用中,服务器会监听并防止终止,但在无服务器应用中,它会在所有代码执行完后退出程序,不会等待 crons。
我应该为此编写 while(true)
循环吗?
为此,节点中的最佳实践是什么?
提前致谢!
因为nodejs是单线程的,所以while(true)
是行不通的。它只会抓住整个 CPU 而没有其他东西可以 运行.
nodejs 将留在 运行ning 时,当任何东西在未来可能 运行 存在时。这包括打开的 TCP 套接字、侦听服务器、计时器等...
为了更具体地回答,我们需要查看您的代码并了解它是如何使用 node-cron 的,但是您只需添加一个简单的 setInterval()
这样的像这样:
setInterval(function() {
console.log("timer that keeps nodejs processing running");
}, 1000 * 60 * 60);
但是,node-cron 本身使用计时器,因此看起来如果您正确使用 node-cron 并且您正确地将任务安排到 运行 将来,那么您的 nodejs 进程应该不会停止。所以,我怀疑你真正的问题是你没有用 node-cron 正确地安排未来的任务。只有您向我们展示您使用 node-cron 的实际代码,我们才能帮助您解决这个问题。
您可以从进程的标准输入开始读取:
import process from 'process';
process.stdin.resume();
// do your thing
这将防止进程立即终止。
这是官方文档中的mentioned。
但是,这可能会阻止您的进程被正常终止。
基于@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();
我正在创建基于 NodeJS 的爬虫,它与 node-cron
包一起工作,我需要防止入口脚本退出,因为应用程序应该 运行 永远作为 cron 并且将在特定时期执行爬虫日志。
在 web 应用中,服务器会监听并防止终止,但在无服务器应用中,它会在所有代码执行完后退出程序,不会等待 crons。
我应该为此编写 while(true)
循环吗?
为此,节点中的最佳实践是什么?
提前致谢!
因为nodejs是单线程的,所以while(true)
是行不通的。它只会抓住整个 CPU 而没有其他东西可以 运行.
nodejs 将留在 运行ning 时,当任何东西在未来可能 运行 存在时。这包括打开的 TCP 套接字、侦听服务器、计时器等...
为了更具体地回答,我们需要查看您的代码并了解它是如何使用 node-cron 的,但是您只需添加一个简单的 setInterval()
这样的像这样:
setInterval(function() {
console.log("timer that keeps nodejs processing running");
}, 1000 * 60 * 60);
但是,node-cron 本身使用计时器,因此看起来如果您正确使用 node-cron 并且您正确地将任务安排到 运行 将来,那么您的 nodejs 进程应该不会停止。所以,我怀疑你真正的问题是你没有用 node-cron 正确地安排未来的任务。只有您向我们展示您使用 node-cron 的实际代码,我们才能帮助您解决这个问题。
您可以从进程的标准输入开始读取:
import process from 'process';
process.stdin.resume();
// do your thing
这将防止进程立即终止。
这是官方文档中的mentioned。
但是,这可能会阻止您的进程被正常终止。
基于@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();