crontab任务不执行八成是PATH问题:crond默认PATH仅为/usr/bin:/bin,不继承终端环境,需在crontab顶部显式声明PATH和HOME,并用绝对路径调用命令。
crontab里任务存在但不执行,八成是PATH问题
linux的crond进程启动时用的是极简环境,path默认只有/usr/bin:/bin,不读~/.bashrc,也不继承gui终端的环境变量。你在终端里能直接敲mysqldump或navicatcli,放进crontab -e就报command not found,基本就是这个原因。
解决方法很简单:在crontab -e文件顶部显式声明路径:
PATH=/usr/local/bin:/usr/bin:/bin:/opt/navicat/binHOME=/home/your_user- 所有命令必须写绝对路径,比如
/usr/bin/mysqldump、/opt/navicat/navicatcli
Navicat CLI脚本执行失败,DISPLAY和XAUTHORITY缺一不可
navicatcli在Linux下仍需访问X11服务,哪怕不弹窗——否则连接MySQL 8.0+或启用SSL时可能卡在认证阶段,日志只显示超时,无具体错误。
在crontab中调用时,必须同时设置两个变量:
-
DISPLAY=:0(对应你桌面会话的显示编号) -
XAUTHORITY=/home/your_user/.Xauthority(必须是真实存在的文件路径) - 如果用户用LightDM/GDM登录,
DISPLAY通常是:0;不确定可先在终端运行echo $DISPLAY确认
备份脚本生成空文件或权限拒绝,检查目标路径和用户上下文
Navicat导出或备份任务若指定路径为/var/www/backups或/opt/data这类系统目录,而crond以普通用户运行,就会因权限不足静默失败——既不报错,也不生成文件。
实操要点:
- 备份路径必须是当前用户有
rwx权限的目录,例如/home/your_user/navicat_backups - 确保该目录存在:
mkdir -p /home/your_user/navicat_backups,再chown your_user:your_user /home/your_user/navicat_backups - 不要用
sudo crontab -e——它跑在root上下文,读不到你的~/.navicat/Profiles/和许可证 - 统一用你日常登录桌面的用户执行
crontab -e
日志没输出?重定向必须加,且优先查系统级cron日志
crontab任务失败时往往不提示,靠看日志是唯一可靠手段。但光在命令后加> /tmp/log 2>&1还不够,因为有些错误发生在shell加载前(比如DISPLAY未设),根本进不了脚本。
建议分两层排查:
- 在crontab命令行末尾加完整重定向:
0 3 * * * /opt/navicat/navicatcli --backup "prod_db" >> /var/log/navicat_backup.log 2>&1 - 同时查系统cron日志:
grep CRON /var/log/syslog(Ubuntu/Debian)或journalctl -u cron -n 50(CentOS/RHEL),看是否有(your_user) CMD记录但无后续
真正容易被忽略的是:即使crontab -l能看到任务,只要crond服务本身是inactive (dead),它就完全不会触发——连日志都不会留。务必先systemctl status cron确认状态。


















