Linux crontab + Server酱:定时任务失败微信告警

效果:当 crontab 定时执行的脚本或命令失败时,你的微信会立刻收到一条包含失败时间和任务信息的告警消息。

前置条件

  1. 一个 Server酱 SendKey。如果你还没有,请参考 30 秒获取教程
  2. 一台运行 Linux/Unix 系统的服务器,并安装了 curl 工具。

配置步骤

第一步:在 crontab 中定义 SendKey 变量

打开你的 crontab 配置文件(使用 crontab -e 命令),在文件顶部添加一行,定义你的 SendKey 环境变量。这可以避免在每条命令中重复输入。

SERVERCHAN_SENDKEY=你的SENDKEY

第二步:在任务命令后追加失败通知

在 crontab 中,你可以使用 || 操作符。它的逻辑是:只有当 || 前面的命令执行失败(退出状态码非 0)时,才会执行后面的推送命令。

将下面这行示例添加到你的 crontab 中,替换其中的脚本路径和告警信息:

0 3 * * * /opt/backup.sh || /usr/bin/curl -sS -X POST "https://sctapi.ftqq.com/${SERVERCHAN_SENDKEY}.send" -d "title=备份任务失败" -d "desp=$(date '+\%F \%T') backup.sh 退出码非零"

关键点说明:

  • ||:连接符,表示“或”,前面命令失败才执行后面。
  • /usr/bin/curl:建议使用 curl 的绝对路径,因为 crontab 的执行环境 PATH 变量通常很精简。
  • -sS-s 静默模式,-S 在出错时仍显示错误信息。
  • date '+\%F \%T':用于在消息正文中插入当前时间。注意:crontab 中的 % 必须转义为 \%,否则会被解释为换行符。
  • desp 参数内容可以根据需要修改,例如加入更多上下文(单行内用空格/逗号分隔即可):-d "desp=主机: $(hostname),时间: $(date '+\%F \%T'),任务: /opt/backup.sh 执行失败"

第三步:测试配置

保存并退出 crontab 编辑器后,你可以临时修改一个任务的时间为即将到来的分钟,或者手动执行一次带 || 的命令组合来测试告警是否生效。

完整示例

以下是一个完整的 crontab 文件示例,包含了数据库备份和日志清理任务,并为它们分别配置了失败告警。

# 定义 Server酱 SendKey
SERVERCHAN_SENDKEY=你的SENDKEY

# 每天凌晨3点备份数据库,失败则告警
0 3 * * * /usr/local/bin/backup_db.sh || /usr/bin/curl -sS -X POST "https://sctapi.ftqq.com/${SERVERCHAN_SENDKEY}.send" -d "title=【失败】数据库备份" -d "desp=$(date '+\%F \%T') 数据库备份脚本执行失败,请检查日志。"

# 每周一凌晨2点清理日志,失败则告警
0 2 * * 1 /usr/local/bin/clean_logs.sh || /usr/bin/curl -sS -X POST "https://sctapi.ftqq.com/${SERVERCHAN_SENDKEY}.send" -d "title=【失败】日志清理" -d "desp=$(date '+\%F \%T') 日志清理任务失败。"

# 每小时同步一次文件,成功也发通知(使用 &&)
0 * * * * /usr/local/bin/sync_files.sh && /usr/bin/curl -sS -X POST "https://sctapi.ftqq.com/${SERVERCHAN_SENDKEY}.send" -d "title=【成功】文件同步" -d "desp=$(date '+\%F \%T') 文件同步完成。"

常见问题

推送额度是多少? 免费用户每天可发送 5 条消息。订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。

消息没收到怎么办? 请首先检查 常见问题与排查指南。常见原因包括:SendKey 错误、网络不通、消息内容触发了风控规则。

有发送频率限制吗? 为防止滥用,Server酱 API 有频率限制,免费用户每分钟不超过 50 次调用。对于 crontab 告警场景,通常不会触发此限制。

为什么 curl 命令在 crontab 里不执行?

  1. 环境变量:crontab 环境与 Shell 登录环境不同。确保 curl 使用了绝对路径(如 /usr/bin/curl),并且 SERVERCHAN_SENDKEY 变量在 crontab 文件内正确定义。
  2. 转义字符:确保 date 命令中的 % 已正确转义为 \%
  3. 权限问题:确保执行 crontab 的用户有权限运行 curl 命令。

可以同时推送成功和失败通知吗? 可以。使用 命令 && 成功推送命令 || 失败推送命令 的结构。注意,如果成功推送命令本身失败,也会触发 || 后的失败推送。

相关集成

懒人方案:把这段话复制给你的 AI 助手

把下面这段文字原样粘贴给 Claude Code、Cursor 或任何 AI 编程助手,它就会替你完成 Server酱 的接入:

请帮我把 Server酱 微信通知接入到我当前的项目/工具中:
1. API:POST https://sctapi.ftqq.com/{SendKey}.send,参数 title(必填,不能含换行)、desp(正文,支持 Markdown,可选);成功时返回 JSON 的 code 为 0。
2. 如果我的 SendKey 以 sctp 开头,则改用 https://{uid}.push.ft07.com/send/{SendKey}.send,uid 是 SendKey 中 sctp 与 t 之间的数字。
3. SendKey 从环境变量 SERVERCHAN_SENDKEY 读取;如果没有,提醒我到 https://sct.ftqq.com 免费获取(每天 5 条额度)。
4. 安全要求:不要把 SendKey 硬编码进代码、不要打印到日志、不要提交到 git。
5. 频率约定:任务结束发 1 条结果摘要即可,批量任务合并成一条,不要每步都推。
请根据我当前的项目和场景直接写好代码/配置并验证。