Linux crontab + Server酱:定时任务失败微信告警
效果:当 crontab 定时执行的脚本或命令失败时,你的微信会立刻收到一条包含失败时间和任务信息的告警消息。
前置条件
- 一个 Server酱 SendKey。如果你还没有,请参考 30 秒获取教程。
- 一台运行 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 里不执行?
- 环境变量:crontab 环境与 Shell 登录环境不同。确保
curl使用了绝对路径(如/usr/bin/curl),并且SERVERCHAN_SENDKEY变量在 crontab 文件内正确定义。 - 转义字符:确保
date命令中的%已正确转义为\%。 - 权限问题:确保执行 crontab 的用户有权限运行
curl命令。
可以同时推送成功和失败通知吗?
可以。使用 命令 && 成功推送命令 || 失败推送命令 的结构。注意,如果成功推送命令本身失败,也会触发 || 后的失败推送。
相关集成
- Python 脚本推送 - 在更复杂的 Python 脚本中集成推送。
- Uptime Kuma 宕机告警 - 监控网站与服务可用性。
- 青龙面板任务通知 - 管理定时运行的面板脚本并接收通知。