Healthchecks Shell 脚本接入实战:用 curl 为 cron 与后台任务加上 Ping 监控
后端任务调度【免费下载链接】healthchecksOpen-source cron job and background task monitoring service, written in Python Django项目地址https://gitcode.com/gh_mirrors/he/healthchecks点击查看免费下载本指南以 healthchecks 官方文档 templates/docs/bash.md 为核心讲解如何在任意 Shell 脚本中通过一条 curl 命令接入 healthchecks开源 cron 任务与后台进程监控服务基于 Python Django 实现完成成功/失败信号的主动上报、命令输出日志的上传以及基于 slug 的自动注册auto provisioning。读完本文你可以在 5 分钟内为自己的备份、证书续期、数据库导出等脚本加上带重试、超时与失败语义的监控能力并理解这些行为在服务端源码中的落地方式。一、原理速览一个 HTTP 请求就是一个监控信号healthchecks 的接入方式非常简单每个检查Check都有一个专属的 ping URL。脚本在关键节点对该 URL 发起 HTTP 请求GET / HEAD / POST 均可见 Pinging API 文档healthchecks 服务端收到请求后记录一次 ping并据此判断任务是否按时完成。ping URL 的构造规则在 hc/api/urls.py 中一目了然按 UUID 标识PING_ENDPOINTuuid以及/start、/fail、/log、/exit-status等后缀按 slug 标识PING_ENDPOINTping-key/slug同样支持上述后缀。其中PING_ENDPOINT是部署时的基础端点。在 hc/settings.py 中可以看到它的默认值由SITE_ROOT推导SITE_NAME os.getenv(SITE_NAME, Mychecks) PING_ENDPOINT os.getenv(PING_ENDPOINT, SITE_ROOT /ping/) PING_BODY_LIMIT envint(PING_BODY_LIMIT, 10000)也就是说自托管部署时可以通过SITE_NAME、SITE_ROOT、PING_ENDPOINT等环境变量定制站点名与端点地址。在 Web 界面中每个检查的详情页会直接展示可复制的 ping URL官方文档中的PING_URL、PING_ENDPOINT、SITE_NAME等占位符由 hc/front/management/commands/pygmentize.py 在渲染文档时替换为真实值脚本里只需要把PING_URL换成你自己的 URL 即可。二、最小接入在脚本里发一条 curlcurl 和 wget 是最常用的两个命令行 HTTP 客户端healthchecks 官方在 templates/docs/bash.md 中给出了两种等价写法# Sends an HTTP GET request with curl: curl -m 10 --retry 5 PING_URL # Silent version (no stdout/stderr output unless curl hits an error): curl -fsS -m 10 --retry 5 -o /dev/null PING_URL第一行最简向PING_URL发起一次 GET 请求表示任务成功完成对持续运行型任务则代表进程仍存活且健康。第二行是生产环境推荐写法——把 curl 的进度条和正常输出全部静默掉只在出错时才暴露信息避免污染脚本自身的 stdout/stderr 输出管道。三、逐参数拆解每个 curl 选项的含义官方文档对上述参数逐一给出了说明整理如下-m seconds请求允许的最大耗时秒。配合--retry使用时每次重试都会重置计时器——也就是说单次尝试最多花费这么多秒而不是整轮重试累计。--retry num遇到瞬时错误时最多重试的次数。默认情况下 curl 会采用递增的退避间隔1s、2s、4s、8s……也可以用--retry-delay覆盖。curl 判定的瞬时错误包括超时以及 HTTP 状态码 408、429、500、502、503、504。-f, --fail让 curl 把非 200 响应视为错误。不加该参数时即使服务端返回 4xx/5xxcurl 仍以退出码 0 结束脚本的$?会误判为成功——这是隐蔽的监控失效来源。-s, --silent静默模式。隐藏进度条但同时也会隐藏错误信息。-S, --show-error与-s搭配使用重新启用错误信息的输出。二者合写为-fsS正是官方示例的用法。-o /dev/null把 curl 的 stdout 重定向到/dev/null错误信息仍走 stderr。由于 ping 响应体通常是 OK 这样无意义的短字符串丢弃它不会丢失任何诊断信息。如果脚本环境没有 curlwget 也可作为替代如wget --spider -q PING_URL但官方示例与参数说明以 curl 为标准。四、主动上报失败/fail与/{exit-status}healthchecks 的默认语义是超时未 ping 即判失败。但很多场景下我们希望主动、立即上报失败从而把告警延迟从超时等待缩短到出错瞬间。做法很简单在任意 ping URL 上追加/fail或/{exit-status}。/fail直接发送失败信号/{exit-status}追加任务的退出码。退出码为 0 视为成功非 0 一律视为失败。退出码必须是 0–255 之间的整数。官方示例用/usr/bin/certbot renew演示了通过$?读取退出码并拼接到 URL 的完整写法#!/bin/sh # Payload here: /usr/bin/certbot renew # Ping SITE_NAME curl -m 10 --retry 5 PING_URL/$?服务端如何解释这段 URL看 hc/api/urls.py 中的路由定义path(int:exitstatus, views.ping)捕获退出码再看 hc/api/views.py 中的ping()视图if exitstatus is not None and exitstatus 255: return HttpResponseBadRequest(invalid url format) ... if exitstatus is not None and exitstatus 0: action fail即退出码超过 255 会返回 400 invalid url format与文档中描述的 0–255 整数约束完全对应非 0 退出码被映射为fail动作0 则保持成功。该逻辑对 UUID 与 slug 两种寻址方式同样生效。管道陷阱别忘了set -o pipefail脚本里经常出现command1 | command2 | command3的管道写法。Bash/Sh 的默认规则是管道的退出码等于最右侧命令的退出码。这意味着即使左侧命令失败只要右侧命令成功$?依然是 0脚本会误报成功。官方示例用数据库备份场景展示了这一点#!/bin/sh set -o pipefail pg_dump somedb | gpg --encrypt --recipient aliceexample.org --output somedb.sql.gpg # Without pipefail, if pg_dump command fails, but gpg succeeds, $? will be 0, # and the script will report success. # With pipefail, if pg_dump fails, the script will report the exit code returned by pg_dump. curl -m 10 --retry 5 PING_URL/$?开启set -o pipefail后只要管道中任何一个环节失败$?就会取到首个失败命令的退出码PING_URL/$?上报的自然是失败信号。建议把set -o pipefail与set -euo pipefail一起放在脚本头部配合本文的 ping 上报形成任一步骤出错立即上报失败的健壮监控闭环。五、把命令输出作为日志上报HTTP POST --data-raw如果希望故障排查时有更多上下文可以在 ping 时附带诊断信息。做法是改用HTTP POST把命令输出放进请求体#!/bin/sh m$(/usr/bin/certbot renew 21) curl -fsS -m 10 --retry 5 --data-raw $m PING_URL要点在于21把 stderr 并入 stdout$(...)捕获全部输出--data-raw $m原样作为 POST 请求体发送。服务端的行为由 hc/api/views.py 中的这行代码决定body request.body[: settings.PING_BODY_LIMIT]即只要请求体是合法的 UTF-8 字符串healthchecks 就接受并存储请求体的前PING_BODY_LIMIT字节默认 10000 字节可用环境变量调整见 hc/settings.py其余部分会被截断丢弃。响应头中的Ping-Body-Limit: n会告知客户端服务端实际愿意存储的字节数方便客户端据此裁剪后续请求体详见 hc/api/views.py 的实现。从源码结构看较大的请求体还有一层优化在 hc/api/models.py 的Check.ping()方法中超过 100 字节且配置了S3_BUCKET时请求体会写入对象存储ping.object_size len(body)否则直接存入数据库的body_raw字段——日志不会挤爆数据库行。更多关于日志大小限制、只保留最后 N 字节等技巧可继续阅读 attaching_logs.md。六、自动注册?create1让脚本第一次运行就创建检查healthchecks 支持自动创建auto provisioning当请求指向一个尚不存在的 slug 时服务端会顺手把它创建出来。官方在 autoprovisioning.md 中说明启用该能力只需在slug 风格的 ping URL 末尾追加?create1。官方示例用系统主机名作为 slug实现首次运行即注册#!/bin/bash PING_KEYfixme-your-ping-key-here # Use systems hostname as checks slug SLUG$(hostname) # Construct a ping URL and append ?create1 at the end: URLPING_ENDPOINT$PING_KEY/$SLUG?create1 # Send a ping: curl -m 10 --retry 5 $URL服务端的判定逻辑在 hc/api/views.py 的ping_by_slug()中先按(slug, project__ping_key)查现有检查不存在且 URL 带create1→ 创建检查名称与 slug 均取该 slug并自动关联项目下全部通知渠道check.assign_all_channels()响应 201 Created存在→ 正常记录 ping响应 200 OKslug 重复匹配到多个检查→ 返回 409 ambiguous slug本次请求被忽略slug 含大写字符slug ! slug.lower()→ 返回 400 invalid url formatslug 只允许a-z、0-9、下划线和连字符。该能力尤其适合动态基础设施把 Ping Key 分发给各监控客户端每个客户端用自身主机名等标识作 slug就能在发送首个 ping 时边用边注册无需预先在 Web 界面建好全部检查。需要留意自动创建检查的默认配置来自 autoprovisioning.md配置项默认值Period周期1 天Grace time宽限期1 小时通知渠道项目下全部已启用集成目前无法通过 ping URL 指定自定义周期、宽限期等参数如需调整只能去 Web 界面或通过 Management API见 api.md修改。此外自动创建允许临时超出账户检查数上限最多 2 倍免费账户上限 20 个付费账户 100 或 1000 个相关上限判断同样实现在 hc/api/views.py 中。七、从源码看一次 ping 的完整旅程为了对上述行为有更底层的把握最后沿着 hc/api/models.py 的Check.ping()梳理服务端记录一次 ping 的关键步骤均处于数据库事务中加锁select_for_update()锁定当前检查行规避 MariaDB 下并发 ping 的死锁风险处理 start 信号记录last_start与last_start_rid供后续计算执行时长处理成功/失败信号更新last_ping若携带的ridrun ID客户端自行指定的 UUID与 start 时的rid匹配则算出last_duration状态变化时通过create_flip()记录翻转事件更新调度状态重算alert_after下次应触发告警的时间点n_pings自增落库 Ping 记录保存远端地址、协议、HTTP 方法、User-Agent超 200 字符截断、请求体超 100 字节且配 S3 时转存对象存储、rid与exitstatus定期清理每收到 100 次 ping 触发一次prune()按账户的ping_log_limit清理过期 ping 与通知记录。由此可以确认一个事实/{exit-status}、rid、create1等能力不是简单的 URL 转发而是完整落库的监控语义——这也是 healthchecks 在脚本化监控上保持简洁接口与扎实实现的原因。配套可继续阅读 http_api.md 了解 start / fail / log / exit-status 各端点及rid参数的完整规范以及 configuring_checks.md 了解检查周期、宽限期与告警语义的配置方式。赞分享后端任务调度【免费下载链接】healthchecksOpen-source cron job and background task monitoring service, written in Python Django项目地址https://gitcode.com/gh_mirrors/he/healthchecks点击查看免费下载相关推荐Healthchecks 集成 Prometheus为 Cron 任务与后台任务导出监控指标并接入 GrafanaHealthchecks 集成 Prometheus为 Cron 任务与后台任务导出监控指标并接入 Grafana 本篇指南基于开源仓库 healthchec后端任务调度Healthchecks 从 Ruby 发送 Ping 请求用 net/http 监控 Cron 任务与后台作业Healthchecks 从 Ruby 发送 Ping 请求用 net/http 监控 Cron 任务与后台作业 本指南以 Healthchecks 官方文档后端任务调度Healthchecks 自托管指南用 Python Django 搭建 Cron 任务与后台任务监控服务Healthchecks 自托管指南用 Python Django 搭建 Cron 任务与后台任务监控服务 导读 Healthchecks 是一款开源的定后端任务调度上一篇OpenMontage 中的 FLUX 图像生成最佳实践提示工程、模型选型与多参考图编辑完整指南下一篇RustFS 桶元数据诊断与恢复export/import 管理 API 的备份、故障定位与不可读目标修复实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Ghidra-学习日记-01-安装与初识

Ghidra-学习日记-01-安装与初识

目录 一、环境信息 二、介绍 三、环境准备 四、版本下载 五、内存调整 六、测试程序 1、Riddle.c源码 2、编译 3、运行 七、实践 1、创建目录 2、启动 3、新建项目 4、导入文件 5、反编译 6、分析 八、实用技巧 1、全局搜索 2、函数列表 一、环境信息 名称值…

2026/10/14 5:13:34 阅读更多 →
软考网络工程师真题解析:QinQ、OSPF与链路聚合实战

软考网络工程师真题解析:QinQ、OSPF与链路聚合实战

简介:这份资源是2024年下半年网络工程师案例分析真题的答案解析文档,面向备考网络工程师资格考试的技术人员及从事网络设计与故障排除的IT从业者。内容围绕真实项目场景展开,涵盖VLAN与QinQ配置、OSPF邻居建立与虚链路排错、综合布线规划、AC…

2026/10/13 20:50:24 阅读更多 →
Academic Research Skills 安装教程:2 条命令 30 秒搭好论文流水线(CLI / VS Code / JetBrains 通用)

Academic Research Skills 安装教程:2 条命令 30 秒搭好论文流水线(CLI / VS Code / JetBrains 通用)

Academic Research Skills 安装教程:2 条命令 30 秒搭好论文流水线(CLI / VS Code / JetBrains 通用) 【免费下载链接】academic-research-skills Academic Research Skills for Claude Code: research → write → review → revise → fina…

2026/10/11 8:41:17 阅读更多 →

最新新闻

微信小程序云开发超市库存管理系统源码解析与二次开发指南

微信小程序云开发超市库存管理系统源码解析与二次开发指南

最近我拆了一套微信小程序超市库存管理系统,也就是标题里那个71788编号的源码包。整套系统基于微信小程序云开发实现,包含商品管理、入库出库、库存预警、供应商管理和基础报表,完成度比预想中高不少,适合做小程序进销存项目的参考…

2026/10/14 5:13:02 阅读更多 →
CentOS 8.0安装Oracle 12cR2全流程指南:兼容性处理与高频报错排查

CentOS 8.0安装Oracle 12cR2全流程指南:兼容性处理与高频报错排查

CentOS 8.0 和 Oracle 12c Release 2 天生就有个时间差:12.2.0.1 发布时还是 Red Hat 7 的时代,CentOS 8 的发行说明里根本没有它的一席之地。我最初以为无非是装几个依赖包的事,结果真正动手时才发现,光是缺少 compat-libstdc-33…

2026/10/14 5:13:02 阅读更多 →
告别AI应用廉价感:5个可落地的设计决策

告别AI应用廉价感:5个可落地的设计决策

我常年看别人拿AI代码工具做产品,发现一个特别有意思的现象:功能跑得通,界面也齐全,但成品一眼看过去就是“便宜货”。那种感觉就像用了最新款的厨具,做出来的菜却带着食堂味。很多人归咎于自己不会审美,但…

2026/10/14 5:13:02 阅读更多 →
数据提取完整实践复盘:从需求拆解到稳定落地全流程

数据提取完整实践复盘:从需求拆解到稳定落地全流程

一个"数据提取_1"引发的完整实践复盘:从需求拆解到稳定落地的全流程"数据提取_1"这个标题,乍看像是一个临时命名的脚本文件或者项目目录,但做过数据处理的人都知道,这背后往往是一个"看起来简单&#xf…

2026/10/14 5:13:02 阅读更多 →
长活动按声音对齐后片尾漂移,起点通过不代表整段同步

长活动按声音对齐后片尾漂移,起点通过不代表整段同步

多机位视频可在剪映专业版当前支持的同步流程尝试按声音对齐,再人工检查整段。长活动的片头对上了,片尾口型或动作却落后,应先看连续录制区间、素材时长与后期处理,不把一次自动匹配通过当作全程同步。声音定位能帮助起点判断&…

2026/10/14 5:13:02 阅读更多 →
EPLAN电气项目图纸高效读图与安全复用指南

EPLAN电气项目图纸高效读图与安全复用指南

做电气设计这些年,我经手过不少EPLAN项目文件,有自己从头画的,也有从同行手里拿到后二次改造的。一个很直观的体会是:同样是"分享图纸",文件与文件之间的价值差距可以非常大。有的图纸打开就能当标准模板用&…

2026/10/14 5:12:02 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →