crontab中脚本报错因环境变量和工作路径与手动执行不一致——需在crontab开头显式设置path、shell、home等变量,所有命令和路径用绝对路径,并通过env日志对比验证,或在脚本内主动切换目录和加载配置。

脚本手工能跑、crontab 里报“command not found”或“no such file or directory”,核心就是环境变量和工作路径不一致——cron 不读你的 ~/.bashrc,也不在脚本目录下启动,得手动补全。
在 crontab 开头统一设好关键变量
这是最稳、最推荐的做法。用 crontab -e 编辑,第一行就定义:
-
PATH:必须包含你用到的所有命令路径,比如
/usr/bin:/bin:/usr/local/bin:/home/youruser/.local/bin:/opt/mssql-tools/bin -
SHELL:固定为
/bin/bash,避免解释器差异 -
HOME:设成你的家目录(如
/home/youruser),让~展开和配置文件读取不出错 - 其他需要的变量(如
PYTHONPATH、MY_APP_HOME)也直接写在这里,等号两边别加空格
所有路径都用绝对路径写死
别信 python3 script.py 或 ./backup.sh 这类写法。cron 启动时工作目录是用户 home,不是脚本所在位置。
- 查命令真实路径:
which python3、which mysqldump、realpath your_script.sh - 任务行里直接写全路径:
/usr/bin/python3 /opt/myapp/run.py,而不是python3 /opt/myapp/run.py - PHP 或 Python 脚本内部也别用
./data,改用/opt/myapp/data或__DIR__ . '/data'
验证当前 cron 环境到底什么样
别猜,直接看。加一条测试任务:
* * * * * env > /tmp/cron_env.log 2>&1- 等一分钟,运行
cat /tmp/cron_env.log,重点看PATH和HOME - 再对比你在终端里执行
env的输出,差哪补哪
脚本开头主动加载或切换上下文
如果 crontab 全局配置不方便改,就在脚本第一行处理:
- Shell 脚本:开头加
cd /opt/myapp && source ~/.bashrc 2>/dev/null || true(注意.bashrc里要有非交互判断保护) - PHP 脚本:用
$baseDir = __DIR__;定义根路径,后续所有文件操作基于它拼接 - Python 脚本:开头加
import os; os.chdir(os.path.dirname(__file__)),确保相对路径有效











