# Linux crontab 接入 Server酱：定时任务失败微信告警（2026 教程）

> 当 Linux crontab 定时任务（如备份、同步）失败时，自动推送告警到微信，无需手动检查日志。通过 curl 命令调用 Server酱 API 实现。

- 网页版：https://sct.ftqq.com/docs/integrations/crontab/
- 更新日期：2026-07-17

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

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

## 前置条件

1.  一个 Server酱 SendKey。如果你还没有，请参考 [30 秒获取教程](https://sct.ftqq.com/docs/getting-started/sendkey/)。
2.  一台运行 Linux/Unix 系统的服务器，并安装了 `curl` 工具。

## 配置步骤

### 第一步：在 crontab 中定义 SendKey 变量

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

```bash
SERVERCHAN_SENDKEY=你的SENDKEY
```

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

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

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

```bash
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 文件示例，包含了数据库备份和日志清理任务，并为它们分别配置了失败告警。

```bash
# 定义 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 条（[价格详情](https://sct.ftqq.com/subscribe)）。

**消息没收到怎么办？**
请首先检查 [常见问题与排查指南](https://sct.ftqq.com/docs/getting-started/faq/)。常见原因包括：SendKey 错误、网络不通、消息内容触发了风控规则。

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

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

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

## 相关集成

*   [Python 脚本推送](https://sct.ftqq.com/docs/integrations/python/) - 在更复杂的 Python 脚本中集成推送。
*   [Uptime Kuma 宕机告警](https://sct.ftqq.com/docs/integrations/uptime-kuma/) - 监控网站与服务可用性。
*   [青龙面板任务通知](https://sct.ftqq.com/docs/integrations/qinglong/) - 管理定时运行的面板脚本并接收通知。


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

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

```text
请帮我把 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 条结果摘要即可，批量任务合并成一条，不要每步都推。
请根据我当前的项目和场景直接写好代码/配置并验证。
```

