Linux Crontab 定时任务避坑备忘:环境变量与路径陷阱
“在终端手动执行脚本完全正常,但一放进 Crontab 就不执行或者报各种找不到命令的错误。”这是绝大多数 Linux 运维与开发者都踩过的典型陷阱。本文系统剖析问题根源与防坑规范。
一、核心病根:极度精简的 Crond 运行环境
用户手动登录终端时,系统会自动加载 /etc/profile、~/.bashrc 等文件,注入了丰富的 $PATH 变量。
而 crond 守护进程派生的非交互 Shell,默认只有极少的基础 PATH(通常仅有 /usr/bin:/bin)。
因此,如果你在 Python/Node 脚本里调用了位于 /usr/local/bin 或虚拟环境内的命令,就会提示 command not found。
二、三大黄金军规
1. 绝对路径原则:可执行文件与脚本一律全路径
# ❌ 错误示范:依赖相对路径与系统环境变量
* * * * * python backup.py
# ✅ 正确规范:解释器与脚本均写死完整路径
0 2 * * * /usr/bin/python3 /opt/scripts/backup.py
2. 显式在 Crontab 顶部声明 SHELL 与 PATH
执行 crontab -e 时,建议在文件最上方统一定义环境变量:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 每天凌晨 3:00 执行清理任务
0 3 * * * /opt/scripts/cleanup.sh
3. 绝不“静默执行”:做好标准输出与错误日志重定向
# 将标准输出 (1) 与错误输出 (2) 一同追加到日志文件,便于事后排查
0 4 * * * /opt/scripts/db_dump.sh >> /var/log/cron_backup.log 2>&1
三、时间语法速查
| 字段 | 允许值 | 示例与说明 |
|---|---|---|
| 分 (Minute) | 0 - 59 | */15 每 15 分钟触发一次 |
| 时 (Hour) | 0 - 23 | 0 2 每天凌晨 2 点整 |
| 日 (Day) | 1 - 31 | 1 每月 1 号 |
| 月 (Month) | 1 - 12 | * 每个月 |
| 周 (Week) | 0 - 7 (0/7代表周日) | 1-5 周一至周五工作日 |