
Linux 定时任务(cron)不执行,多数情况不是 cron 本身坏了,而是环境、权限、路径或语法细节出了问题。直接看日志和模拟执行环境,比反复改 crontab 更有效。
检查 cron 服务是否在运行
定时任务不会触发,第一步确认 cron 守护进程是否活着:
- 运行 systemctl status cron(Debian/Ubuntu)或 systemctl status crond(CentOS/RHEL)
- 若显示 inactive (dead),用 sudo systemctl start cron 启动,并设为开机自启:sudo systemctl enable cron
- 注意:用户级 crontab 依赖系统级 cron 服务,服务停了,所有定时任务都会静默失效
验证 crontab 语法和保存是否成功
看似写好了,其实没生效,常见于编辑后未正确退出或语法错误被忽略:
- 用 crontab -l 查看当前用户的任务列表,确认你的条目确实存在
- 避免直接编辑 /var/spool/cron/ 下的文件,必须用 crontab -e,否则 cron 不会重载
- 每行末尾不能有多余空格或不可见字符(如 Windows 换行符),建议用 vi -b 或 cat -A 检查
- 时间格式顺序是:分 时 日 月 周 命令,常见错误如把“周”和“日”位置写反,或用了 0–6 却误设为 1–7
注意命令执行环境差异
cron 使用极简 shell 环境(通常是 /bin/sh),PATH、HOME、SHELL 等变量和你登录时不同,导致命令找不到或脚本失败:
- 在 crontab 中显式定义环境变量,例如:
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/username
* * * * * /path/to/script.sh - 脚本中所有命令尽量用绝对路径(如 /usr/bin/python3 而非 python3)
- 测试方法:在脚本开头加 env > /tmp/cron_env.txt,运行后对比你手动执行时的 env 输出
- 重定向输出很重要:加 > /tmp/cron.log 2>&1 才能看到真实报错
检查权限、路径与用户上下文
谁写的任务、谁在跑、文件归谁、路径是否存在——缺一不可:
- 确认脚本有可执行权限:chmod +x /path/to/script.sh
- 确认脚本中引用的文件、目录、配置路径对 cron 用户(如 www-data、nobody 或你的用户名)可读/可写
- 系统级 crontab(/etc/crontab 或 /etc/cron.d/)需指定运行用户,格式为:
分 时 日 月 周 用户名 命令,漏写用户名会导致任务被跳过 - 如果脚本依赖图形界面、SSH agent、systemd user session 或特定终端特性,cron 默认无法满足,需额外处理(如使用 export DISPLAY=:0 或 loginctl unlock-session)










