linux定时任务不执行通常源于环境、权限、路径或语法问题,需逐层排查:确认crond服务运行、检查crontab语法与绝对路径、设置显式path、赋予脚本执行权限、查看系统日志验证调度。

Linux定时任务不执行,多数情况不是crontab本身坏了,而是环境、权限、路径或语法细节出了问题。定位要从最基础的环节开始逐层验证,避免盲目修改。
确认crond服务是否运行
crontab依赖后台服务 crond(CentOS/RHEL)或 cron(Ubuntu/Debian)。服务没启,所有任务都不会触发。
- 检查状态:systemctl status crond(或 cron)
- 若未运行,启动它:sudo systemctl start crond
- 设为开机自启:sudo systemctl enable crond
验证crontab语法与格式是否正确
一行错,整条任务失效,且crond通常不报错。特别注意空格和特殊字符。
- 用 crontab -l 查看当前用户任务,确认已保存
- 时间字段顺序是:分 时 日 月 周 命令(注意:不是“秒”)
- 命令路径必须写绝对路径(如 /usr/bin/python3,不能只写 python3)
- 重定向输出便于排查:0 2 * * * /path/to/script.sh >> /tmp/cron.log 2>&1
检查执行环境与权限差异
crond以最小环境运行,PATH极简(通常是 /usr/bin:/bin),且不读取用户shell配置文件(如 ~/.bashrc)。
- 在脚本开头显式设置PATH:PATH=/usr/local/bin:/usr/bin:/bin
- 避免使用别名、shell函数或未声明的环境变量
- 确保脚本有可执行权限:chmod +x /path/to/script.sh
- 确认crontab属于目标用户(如root任务不能用普通用户crontab添加)
查看系统日志确认是否触发
即使任务没成功执行,只要被crond读取并尝试调度,就会留下日志痕迹。
- 查cron日志:sudo grep CRON /var/log/syslog(Ubuntu/Debian)或 sudo grep cron /var/log/messages(RHEL/CentOS)
- 看到类似 CRON[1234]: (user) CMD (command) 表示已调度;若无此记录,说明crontab未生效或格式错误
- 配合 journalctl -u crond -n 50 -f 实时观察










