首页/系统/Linux 运维命令速查/场景:cron 报 command not found 排查
定时任务与计划50 条

场景:cron 报 command not found 排查

脚本手动正常、cron 执行失败,九成是 PATH 与登录环境差异;给定位步骤与三种兜底写法。

Linux 运维命令速查系统更新于 2026-10-13

这个场景要解决什么

脚本在终端里跑得好好的,放进 cron 就报命令找不到——九成是环境差异。cron 用的是极简环境:命令搜索路径通常只有系统基本目录,它不读用户的 shell 配置,也不加载别名。定位方法很直接:先把 cron 的真实环境打出来看,再决定是声明搜索路径、写绝对路径,还是加载专用环境文件。

基本信息

适用场景任务手动能跑,cron 里报命令找不到
根本原因cron 的命令搜索路径极简,且不执行登录时的 shell 配置
三种修复任务表顶部声明搜索路径、命令写绝对路径、脚本内加载专用环境文件
排查方式临时任务把环境变量导出到文件,再与交互环境比对

典型使用场景

  • 脚本调用了非系统目录里的工具,例如自定义安装的运行时
  • 用到 java、node 这类存在多版本切换的运行环境
  • 脚本里调用了定义在 shell 配置里的函数或别名
  • 依赖特定的区域或字符集环境变量才能正确输出
  • 迁移到新机器后才出现,说明目标机的安装路径不同

复现与定位

复现与定位
# 临时加一条,把 cron 的真实环境导出(用完立刻删除)
* * * * * env > /tmp/cron-env.txt
cat /tmp/cron-env.txt
# 在守护日志里确认报错内容
journalctl -u crond -n 20 --no-pager | tail
grep CRON /var/log/syslog | tail -n 10

三种修复

三种修复
# ① 任务表顶部声明搜索路径
PATH=/usr/local/bin:/usr/bin:/bin

# ② 任务里直接写绝对路径
0 2 * * * /usr/bin/python3 /opt/app/job.py

# ③ 脚本内部加载专用环境文件
. /etc/app/env.sh
/opt/app/run.sh

环境差异对照

项交互登录 shellcron
命令搜索路径包含用户自定义目录通常只有系统基本目录
默认解释器用户设置的登录 shell通常是精简的 /bin/sh
别名与函数已加载完全不加载
工作目录用户家目录用户家目录,但相对路径不可依赖
任务输出直接显示在终端以邮件形式尝试投递,常被丢弃
核对命令真实位置要用 which -a 一次列出所有匹配;多版本环境里同一个命令名可能指向不同版本,只看一个结果会误判。
想加载登录环境时不要直接加载系统 profile:非交互环境下脚本可能中途退出,导致后面的命令整段不执行,改用专用环境文件更稳。

易错点

  • 任务表里不声明搜索路径,脚本依赖的命令不在默认搜索范围内
  • 加载交互式配置时脚本可能提前退出,后续命令被整段跳过
  • 盲目把搜索路径加得很宽来解决问题,掩盖了版本与路径的真实差异
  • 相对路径在 cron 里不可靠,脚本内应先切换到固定工作目录
  • 把环境差异当成权限问题排查,方向错了会浪费大量时间

数据来源与参考

  • man 5 crontab(environment)
  • RHEL 文档:cron 环境常见问题

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌