at命令不支持直接捕获结果,需在调度脚本末尾主动判断退出码并调用企业微信webhook推送消息,同时显式设置path和绝对路径确保环境兼容,或迁移到systemd timer/cron以提升稳定性。

AT 命令本身不支持直接捕获执行结果或发送通知,它只是将任务提交给系统定时器(atd 守护进程),执行完成后由系统通过 mail 命令发标准邮件(通常到本地用户邮箱,如 /var/mail/$USER)。要实现“捕获执行完毕后的标准邮件通知并路由到企业微信”,关键不是拦截 AT 自身的邮件,而是**绕过默认邮件机制,改用可控方式主动上报结果,并对接企业微信 Webhook**。
1. 不依赖系统 mail,改用脚本内联结果上报
AT 的标准邮件不可靠(可能被禁用、无内容、难解析),更安全的做法是在 at 调度的脚本末尾主动判断执行状态,并调用企业微信机器人接口推送消息。
- 在你被 at 调度的 shell 脚本中,最后一段加上结果上报逻辑
- 用
curl直接调用企业微信 Webhook URL(需提前在企业微信后台创建群机器人,获取 webhook 地址) - 示例片段:
# 假设你的主任务命令是:/opt/app/do_backup.sh
/opt/app/do_backup.sh
EXIT_CODE=$?
<p>if [ $EXIT_CODE -eq 0 ]; then
MSG="✅ at 任务执行成功:$(date)"
else
MSG="❌ at 任务执行失败(退出码 $EXIT_CODE):$(date)"
fi</p><h1>推送到企业微信(替换 YOUR_WEBHOOK_URL)</h1><p>curl -X POST \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"$MSG\"}}" \
<a href="https://www.php.cn/link/e0b58aee1a67ba8ff2ec6c06ce5946d0">https://www.php.cn/link/e0b58aee1a67ba8ff2ec6c06ce5946d0</a></p>2. 确保 at 脚本有完整环境和权限
AT 执行时环境极简(几乎无 PATH、无用户 Shell 配置),容易导致 curl 或命令找不到。
解析微信公众号文章,提取标题、作者、正文、图片等信息。用户发送链接(mp.weixin.qq.com)时触发,自动提取内容并可保存至飞书表格。
- 脚本开头显式声明解释器和 PATH,例如:
#!/bin/bash+export PATH="/usr/local/bin:/usr/bin:/bin" - 使用绝对路径调用关键命令(如
/usr/bin/curl) - 确认运行 at 任务的用户有网络访问权限(尤其若服务器在内网,需能访问企业微信公网接口)
3. 替代方案:用 systemd timer 或 cron + 日志监听(更健壮)
AT 本身已逐渐被弃用(部分新系统默认不启用 atd),且缺乏日志追踪能力。如需长期稳定运行,建议迁移:
- 改用
systemd --on-calendartimer,配合ExecStart=指向带企业微信上报的脚本 - 或用 cron,在 crontab 中写:
0 2 * * * /opt/scripts/backup.sh 2>&1 | logger -t backup-job,再用journalctl -u backup-job.service或日志轮转后触发 webhook - 优势:可查日志、支持依赖、失败重试、权限更清晰
4. 若必须保留 AT,加一层封装 wrapper
为避免每个 at 任务都重复写上报逻辑,可统一封装:
- 写一个通用 wrapper 脚本(如
/usr/local/bin/at-notify),接收原始命令作为参数 - 内部执行命令 → 记录时间/退出码 → 构造消息 → 发送 webhook
- 提交时用:
echo "/usr/local/bin/at-notify '/opt/app/do_backup.sh'" | at now + 5 minutes










