90%是环境差异导致的:crond用极简shell环境,不加载.bashrc,path窄(仅/usr/bin:/bin),home和shell与登录态不同;需检查crontab语法、显式设置path/shell/home、用绝对路径、添加日志重定向并对比env输出。

脚本在命令行能运行,放进 crontab 却不执行,90% 是环境差异导致的。crond 启动时用的是极简 shell 环境,不加载你的 .bashrc、PATH 很窄、HOME 和 SHELL 也和登录态不同。下面几项一一对齐,基本就能定位问题。
确认 crontab 任务确实被加载且语法正确
很多人编辑完没保存,或格式有隐藏错误:
- 运行 crontab -l 查看当前用户任务列表,确认你加的那行真在里面
- 检查时间字段顺序:分、时、日、月、周 —— 常见把“星期”和“日期”位置写反
- 避免行尾空格、Tab 混用,尤其 # 注释不能出现在时间字段后(整行会被当注释跳过)
- 用 crontab.guru 验证表达式是否符合预期
重点查环境变量和路径
这是最常出问题的地方。cron 默认 PATH 通常只有 /usr/bin:/bin,你终端里能直接敲的 python3、node、mysqldump,cron 很可能找不到:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 在 crontab 文件开头显式声明:
PATH=/usr/local/bin:/usr/bin:/bin:/home/username/.local/bin
SHELL=/bin/bash
HOME=/home/username - 脚本里所有命令尽量用绝对路径,比如
/usr/bin/python3 /path/to/script.py,而不是python3 script.py - 临时加一行测试环境:
* * * * * env > /tmp/cron_env.txt 2>&1,等一分钟后cat /tmp/cron_env.txt对比你手动env的输出
检查权限、可执行性与日志输出
脚本本身没问题,不代表 cron 能顺利调用它:
- 确保脚本有执行权限:
chmod +x /path/to/script.sh - 脚本第一行写明解释器,比如
#!/bin/bash或#!/usr/bin/env python3 - 重定向输出到日志,方便排查:
0 2 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1 - 别忽略系统邮件 —— cron 默认把 stdout/stderr 发给本地用户邮箱,查看
cat /var/spool/mail/$(whoami),常有关键报错
验证系统级限制和日志线索
有些发行版做了额外限制,得单独确认:
- 检查
/etc/cron.allow是否存在且包含你的用户名;如果不存在,再看/etc/cron.deny是否把你列进去了 - 查 cron 服务日志:
CentOS/RHEL:sudo journalctl -u crond -n 30 --no-pager
Ubuntu/Debian:sudo grep CRON /var/log/syslog | tail -20 - SELinux 或 AppArmor 可能拦截执行,临时测试可运行
sudo setenforce 0(之后记得setenforce 1)










