cron 里的脚本手动能跑、定时不跑:三个高频原因

举报
ouyang_123 发表于 2026/11/09 08:38:25 2026/11/09
【摘要】 同一行命令,终端里跑得好好的,放进 crontab 就静默失败。PATH、工作目录、转义符三处不一样,逐条对一遍就能定位。

现象

写了个备份脚本,bash /opt/ops/backup.sh 手动跑一切正常。加进 crontab 之后,日志文件是空的,/var/log/cron 里也没有报错,像是根本没执行。

判据

先确认到底有没有被执行,别急着改脚本:

grep CRON /var/log/cron | tail -5

有 CMD 那一行说明 cron 确实起了进程,问题在脚本内部;没有说明 cron 压根没匹配上,去看时间表达式和用户字段。

执行了但失败,再分三处对比:

  1. PATH:cron 的默认 PATH 只有 /usr/bin:/bin,脚本里调 node、docker、python3 全找不到。
  2. 工作目录:cron 从 $HOME 起,脚本里写相对路径必然找不到文件。
  3. % 符号:crontab 里 % 是换行符,日期格式化里的 %F 会被截断。

根因

cron 不读 .bashrc、不读 /etc/profile,环境是干净的。手动跑时 PATH 里有一堆自定义路径,定时跑时没有,command not found 又被 2>/dev/null 吃掉,看起来就是「什么都没发生」。

修法

脚本头部自己声明环境,别指望继承:

#!/usr/bin/env bash
set -euo pipefail
export PATH=/usr/local/bin:/usr/bin:/bin
cd /opt/ops

# 下面才开始真正的逻辑

crontab 里把输出重定向到日志,别丢:

0 3 * * * /bin/bash /opt/ops/backup.sh >> /var/log/backup.log 2>&1

需要 % 的地方写成 \%,或者干脆别在 crontab 里做日期格式化,交给脚本内部的 date 命令。

验证

三个问题分别造一次:

  • 去掉 export PATH:日志出现 1 次 docker: command not found,加上后 0 次。
  • 用相对路径 ./config.yaml:报 1 次 No such file,改成绝对路径后正常。
  • crontab 里写 date +%F:任务每 5 分钟触发一次,实际每天只跑 1 次,加反斜杠后恢复。
  • 最终版连续 7 天,每天 03:00 执行,日志 7 行,成功 7 次。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。