发布于 2026-01-06 3 阅读
0

如何使用简单的 bash 技巧简化 cron 监控

如何使用简单的 bash 技巧简化 cron 监控

如果你使用软件系统的时间足够长,肯定接触过cron。Cron是类 UNIX 操作系统中基于时间的任务调度程序。我们通常会定期运行一些任务/脚本,例如每天上午 9:30。

过去几年,定时任务的设置和运行方式发生了变化,从最初的 crontab命令发展到现在在 Kubernetes 上以CronJob 的形式运行。尽管如此,其基本原理仍然不变,监控定时任务至关重要。您肯定不希望因为定时任务没有运行而导致客户收不到款项。

本文将重点介绍一个简化 cron 任务监控的实用 Bash 小技巧。该方案与编程语言和框架无关,因为它直接在命令中完成。让我们深入了解一下这种 cron 任务监控方法。

定时任务监控至关重要

监控 Cron 进程非常重要

我们当时在开发一个项目,其中包含两个定时任务(CronJob),一个每 6 小时运行一次,另一个每两周运行一次。这个项目是用 Symfony 框架开发的,定时任务被配置成 Symfony 命令,并在 Kubernetes 上以定时任务的形式执行。

我们使用 New Relic 监控应用程序,并通过OpsGenie 心跳监控来监控 Cron 任务是否按时运行并收到通知

你可以使用HealthchecksCronitor,任何适合你需求的工具都可以,关键是当 cron 任务没有在预期的时间和频率上运行时收到警报。

到目前为止一切顺利,但当我查看用于 ping OpsGenie 的代码时,我发现有多种实现方式。大多数方法都是获取最新的 OpsGenie API/SDK 并从应用程序中调用它。甚至有人构建了一个封装库来实现这种心跳 ping 和其他功能。

问题

这种方法存在以下问题:

  • 解决方案是从应用程序调用心跳REST API,但这导致应用程序引入了额外的依赖项和代码。

  • 在 cron 运行成功后调用 API 是特定于语言/框架的,例如,为 PHP 编写的代码不适用于 NodeJs/Typescript。

  • 如果 API 要升级到新版本,每个应用程序都需要进行不同的更改,因为调用取决于应用程序代码。

解决方案

以上所有问题的解决方案都很简单,使用带有 &&运算符的bash ,这样只有在 cron 运行成功时才会运行 ping 命令。

“&&”用于将命令串联起来,只有当前面的命令无错误退出(或者更准确地说,以返回码0退出)时,才会执行下一个命令。——来源

我们运行了 Symfony cron 命令,并向 OpsGenie 发送了 ping 请求,如下所示:

    bin/console our-cron:command \
    && curl -X GET 'https://api.opsgenie.com/v2/heartbeats/our-cron/ping' --header 'Authorization: GenieKey '"$OPSGENIE_API_KEY"''
Enter fullscreen mode Exit fullscreen mode

我们对上述命令做了一些不同的修改,创建了一个 bash 脚本,其中将命令和心跳名称作为参数发送。

另一个SaaS

我们目前使用的是 OpsGenie,但 cron 监控领域还有其他 SaaS 提供商。Cronitor.io 就是一个可以免费用于单个监控的工具。除了cron 监控之外,Cronitor 还提供网站和 API 的简单正常运行时间监控。它还有一个便捷的命令行工具,可以导入您现有的 crontab 文件并将其发送到 Cronitor。

那么它解决了哪些问题?

  • 无需为了执行 curl 命令而引入额外的库/包。比如我最初考虑过的OpsGenie PHP 客户端:)

  • 该解决方案与语言/框架无关。只要 Docker 容器安装了 bash/sh 或任何其他 shell(通常都会安装),该解决方案就适用于 PHP、Node.js(TypeScript)、Python 甚至 GoLang。

  • 如果 API 升级,则所有存储库中的更改都相同。

结论

尝试寻找跳出固有思维的解决方案。如果我们沿用之前的解决方案,要么需要引入新的库,要么需要自行构建某种 OpsGenie 客户端。虽然这样可以解决问题,但会给我们带来更多依赖项和需要维护的代码。

在尝试寻找解决问题的方法时,退后一步,想想那些不太明显的解决方案。


更多信息请访问Geshan.com.np

文章来源:https://dev.to/geshan/how-to-simplify-cron-monitoring-with-a-simple-bash-trick-4646