根本原因是cron环境PATH默认仅为/usr/bin:/bin,不包含/usr/local/bin;需在crontab顶部显式声明完整PATH,如PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,并验证生效。

在 crontab 中脚本调用 /usr/local/bin 下的命令(如 python3、pip、jq、自编译工具等)报 command not found,根本原因是 cron 启动时只加载极简环境,PATH 默认仅为 /usr/bin:/bin,不包含 /usr/local/bin —— 即使你终端里能直接运行,cron 也完全“看不见”。
明确 PATH 覆盖范围,避免遗漏关键目录
crontab 的 PATH 是全局生效的,必须显式声明所有可能用到的路径。仅加 /usr/local/bin 不够,常见组合应覆盖系统标准路径 + 用户扩展路径:
-
/usr/local/sbin和/usr/sbin:系统管理类命令(如iptables、sshd)常驻于此 -
/usr/local/bin:用户手动安装或编译的软件主程序(如自制工具、新版 python、node 二进制) -
/usr/bin和/bin:基础命令(ls、grep、sh)所在,不可省略 - 若用 conda/miniconda,还需追加类似
/home/username/miniconda3/bin(注意替换为真实路径)
在 crontab 文件顶部统一声明 PATH
编辑任务前先执行 crontab -e,在第一行(注释之前)添加完整 PATH=... 行,格式严格、无空格、用冒号分隔:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/yourname/miniconda3/bin 0 2 * * * /usr/bin/python3 /home/yourname/script.py
⚠️ 注意:
- 不要写成 export PATH=...(crontab 不支持 shell 的 export 语法)
- 不要末尾多加冒号(如 .../bin:),会导致空路径被解析,可能引发意外行为
- 修改后保存退出,cron 会自动重载,无需重启服务
验证实际生效的 PATH 是否正确
光靠“写了就对了”不可靠。加一行临时测试任务,把 cron 真实环境导出查看:
* * * * * env > /tmp/cron_env.log 2>&1
等一分钟,执行 head -n 5 /tmp/cron_env.log,重点确认 PATH= 行是否与你设置的一致,且包含 /usr/local/bin。若不符,说明 crontab 文件未正确保存,或编辑时误用了其他用户(如用 sudo crontab -e 编辑的是 root 的任务,而非当前用户)。
补充建议:对关键脚本做双重保险
即使 PATH 已设好,仍建议在 Python 脚本开头加一句路径诊断,便于快速定位问题:
import os
print("Current PATH:", os.environ.get('PATH', 'NOT SET'))
# 或检查具体命令是否存在
import shutil
if not shutil.which('python3'):
raise RuntimeError("python3 not found in PATH")
也可在 crontab 命令中直接用绝对路径调用(如 /usr/local/bin/python3 script.py),但这种方式维护成本高,适合单次调试,不推荐长期替代 PATH 配置。

















