cron 里的脚本手动能跑、定时不跑:三个高频原因
【摘要】 同一行命令,终端里跑得好好的,放进 crontab 就静默失败。PATH、工作目录、转义符三处不一样,逐条对一遍就能定位。
现象
写了个备份脚本,bash /opt/ops/backup.sh 手动跑一切正常。加进 crontab 之后,日志文件是空的,/var/log/cron 里也没有报错,像是根本没执行。
判据
先确认到底有没有被执行,别急着改脚本:
grep CRON /var/log/cron | tail -5
有 CMD 那一行说明 cron 确实起了进程,问题在脚本内部;没有说明 cron 压根没匹配上,去看时间表达式和用户字段。
执行了但失败,再分三处对比:
PATH:cron 的默认 PATH 只有/usr/bin:/bin,脚本里调node、docker、python3全找不到。- 工作目录:cron 从
$HOME起,脚本里写相对路径必然找不到文件。 %符号: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)