尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ntfy 如何用定时消息更新实现脚本心跳监控(Dead Man‘s Switch)

ntfy 如何用定时消息更新实现脚本心跳监控(Dead Man‘s Switch) ntfy 如何用定时消息更新实现脚本心跳监控Dead Mans Switch【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy你有一类任务在后台长期运行定时备份、数据采集、爬虫、部署检查但脚本一旦挂掉不会有任何人告诉你直到很久以后发现数据没在更新。ntfy 的 scheduled delivery定时投递 和 updating scheduled notifications更新定时消息 两个能力可以解决这个问题先投递一条“5 分钟后送达”的告警消息然后让脚本每分钟用同一个 sequence ID 重新发布一次这条消息把送达时间不断往后推只要脚本还在跑告警就永远不会被投递脚本停止后告警就会如期送达。文档把这个机制直接称为 watchdog / dead mans switch。两点前提均来自项目文档该能力由ntfy server v2.16.02026 年 1 月 19 日发布引入见 releases.md。自建服务器需要升级到该版本公开服务 ntfy.sh 已支持。定时投递在 Android、iOS、Firefox 客户端上受支持心跳消息发布到 ntfy 服务器任何订阅该 topic 的客户端都能收到告警。准备选一个 topic 并订阅它由于 ntfy 没有注册机制topic 本身就相当于密码所以名字要不可猜测字母、数字、下划线、连字符[-_A-Za-z0-9]最长 64 字符文档建议用文档里的 topic name generator 生成带随机后缀的名字。下文示例中的mytopic就是这样一个占位 topic实际使用时替换成你自己的 topic 名示例中的heartbeat-check是自定的 sequence ID用于把历次心跳消息串成同一条“可被替换的定时消息”全程保持一致即可。在手机上安装 ntfy 客户端并订阅该 topic或浏览器打开 web 应用订阅这样后面告警触发时能实际收到推送。主路径心跳脚本文档给出的核心做法是给消息设置In: 5m头In是X-Delay的别名完整别名列表为Delay、X-At、At、X-In、In让消息延迟 5 分钟投递之后每 60 秒再发布一次同 sequence ID 的消息服务器会删除原来那条定时消息、替换为新的这与“更新已投递通知”不同后者两条消息都保留在缓存里。于是只要循环还在跑5 分钟的定时警报就一直在被顺延。bash curl 版本文档示例mytopic替换为你自己的 topic# Dead mans switch: keeps pushing a scheduled message into the future # If this script stops, the alert will be delivered after 5 minutes while true; do curl -H In: 5m -d Warning: Server heartbeat stopped! \ ntfy.sh/mytopic/heartbeat-check sleep 60 # Update every minute done这里 sequence ID 写在 URL 路径里POST /topic/sequence_id这是 ntfy 更新/替换消息的标准方式之一。如果机器上装了 ntfy CLI等价的写法是显式传--sequence-idwhile true; do ntfy publish \ --in5m \ --sequence-idheartbeat-check \ mytopic Warning: Server heartbeat stopped! sleep 60 # Update every minute done文档还提供了 JavaScriptsetIntervalfetch、Go、PowerShell、Python、PHP 的同构示例结构都是“发布In: 5m消息 → 等 60 秒”可按你的运行环境从 publish.md 的 Updating scheduled notifications 一节 直接取用。参数含义均出自文档不要凭参数名猜测其他行为In: 5m设置定时投递时间。文档说明最小延迟10 秒最大延迟3 天最大延迟可用服务器端message-delay-limit选项调整见 config.md 的 message limits。sleep 60心跳间隔。它必须显著小于In的延迟5 分钟这样脚本正常时每轮都能在上一轮到期前把消息替换掉脚本崩溃或机器宕机后就没有新的替换请求最后一次排定的消息会到期投递。验证告警在心跳停止后送达文档给出的触发条件是明确的if the script or system stops running, the message will eventually be delivered as an alert脚本或系统停止运行后消息最终会作为告警被投递。据此可以这样验证运行心跳脚本观察订阅该 topic 的手机/浏览器正常期间不会出现 “Warning: Server heartbeat stopped!” 通知因为每分钟的替换都把送达时间推到了 5 分钟后。杀掉脚本进程kill pid等待约 5 分钟客户端应当收到这条告警通知。收到即说明 dead mans switch 链路发布 → 定时 → 替换 → 到期投递全部生效。另外注意缓存行为定时消息会保留在服务端消息缓存中直到投递后 12 小时或服务器缓存时长设置文档同时说明定时投递功能与“关闭服务端消息缓存”不兼容。可选提前取消一条已排定的告警如果心跳恢复前你只想手动撤掉那条待投递的告警比如确认是计划内停机文档给出了取消方式对/topic/sequence_id发 DELETE 请求或 GET/topic/sequence_id/delete。这会移除定时消息使其永远不会被投递并向所有订阅者发出message_delete事件。ntfy CLI 不支持 DELETE取消这一步要用 curl# 取消 heartbeat-check 这条定时告警 curl -X DELETE ntfy.sh/mytopic/heartbeat-check # 或者通过 GET 取消 curl ntfy.sh/mytopic/heartbeat-check/delete限制与边界以下限制来自文档部署前需要心里有数延迟范围In/Delay最小 10 秒、最大 3 天服务器端message-delay-limit可配所以心跳告警的“死区”最长不能超过 3 天心跳频率也不能低于 10 秒一次。频率与配额服务器默认限流为每访客 60 个并发请求、以每 5 秒 1 个的速度回补ntfy.sh 上每访客每日消息上限为250 条见 publish.md 的 Limitations。按 60 秒一次心跳计算一天约 1440 次发布在 ntfy.sh 上会超过每日上限自建服务器可通过 rate limiting 配置调整这些限制见 config.md。心跳间隔可以适当放大比如 5 分钟或把高频心跳指向自建服务器。消息长度单条消息不超过 4,096 字节超出会按附件处理告警文案保持简短即可。客户端支持更新/删除通知的支持范围文档标注为 Android 与 Firefox 客户端定时投递标注为 Android、iOS、Firefox告警的“到期投递”本身是普通消息投递各客户端均可收到。完成上述步骤后你的验证结果应该很直观脚本存活时客户端静默脚本死亡约 5 分钟后收到告警如果 5 分钟到了却没有收到告警优先检查脚本是否真的停止了对In: 5m消息的重复发布以及客户端是否仍订阅着对应 topic。【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表