首页 > 解决方案 > cron作业完成后是否有必要退出进程?

问题描述

我正在使用 GKE cron 作业和 Node.js。我怀疑是否有必要在 cron 工作完成后退出进程?我知道 GKE 会在 cron 工作完成后销毁 pod。

这是我的代码:

try {
      await job();
    } catch (error) {
      console.error(`Run ${context.jobName} cron job failed.`);
      console.error(error);
      process.exit(1);
    }

process.exit(0)

而且,我发现了另一个问题。如果您使用@google_cloud/logging-winston,如果您在 cron 作业完成后退出该进程。它会抛出一个错误:

错误:7 PERMISSION_DENIED:调用者在 Object.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors 的 Object.exports.createStatusError (/app/node_modules/grpc/src/common.js:91:15) 没有权限.js:1204:28) 在 InterceptingListener._callNext (/app/node_modules/grpc/src/client_interceptors.js:568:42) 在 InterceptingListener.onReceiveStatus (/app/node_modules/grpc/src/client_interceptors.js:618:8) ) 在回调 (/app/node_modules/grpc/src/client_interceptors.js:845:24)

我想@google_cloud/logging-winston尝试记录,但 pod 被破坏了。

使用console.log,错误消失了。我猜@google_cloud/logging-winston是异步记录的。

标签: google-cloud-platformgoogle-kubernetes-engine

解决方案


问题是您的应用程序在winston 可以写入文件日志之前退出。我们通过在执行结束时添加睡眠来解决 cron 任务中的此问题,以确保 winston 已完成。

此外,winston 提供了一个 logger.on('finish') 事件,该事件在写入所有待处理日志时触发。要使用完成事件,您需要在记录器行的末尾调用 logger.end()


推荐阅读