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 周一至周五工作日