Linux定时任务未执行需依次检查cron服务状态、crontab语法与用户权限、脚本环境变量及路径、可执行权限,并通过系统日志(如/var/log/syslog或journalctl)定位具体失败原因。

Linux系统中定时任务未执行,多数情况与cron服务、用户权限、环境变量或脚本本身有关。直接看日志和基础配置,比盲目重写脚本更高效。
确认cron服务是否正常运行
定时任务依赖cron(或crond)守护进程。服务停止或异常会导致所有任务静默失败。
- 检查状态:
systemctl status cron(Debian/Ubuntu)或systemctl status crond(CentOS/RHEL) - 若显示
inactive (dead),启动它:sudo systemctl start cron,并设为开机自启:sudo systemctl enable cron - 注意:某些精简系统(如容器、最小化安装)默认不安装
cron,需手动安装(如apt install cron或yum install cronie)
检查crontab语法与用户上下文
看似正确的crontab条目,可能因格式错误、用户权限或路径问题被忽略。
- 用
crontab -l查看当前用户的任务;用sudo crontab -u username -l查其他用户任务 - 确保每行以合法时间字段开头(共5个字段),结尾换行符不能缺失;空行或注释行前不能有空格
- 系统级crontab(
/etc/crontab或/etc/cron.d/下的文件)必须指定用户名字段,例如:0 2 * * * root /backup.sh - 普通用户默认无权执行
/etc/cron.allow未列出的任务;若存在/etc/cron.deny且包含该用户名,也会被拒绝
验证脚本执行环境与权限
cron使用极简shell环境(通常是/bin/sh),PATH、HOME等变量与交互式终端不同,极易导致命令找不到或路径错误。
- 在crontab中显式定义环境变量,例如:
PATH=/usr/local/bin:/usr/bin:/bin - 脚本路径务必写绝对路径(如
/home/user/script.sh),避免用~或相对路径 - 确保脚本有可执行权限:
chmod +x /path/to/script.sh - 建议在脚本开头加日志输出,例如:
date >> /tmp/cron_debug.log; echo "running" >> /tmp/cron_debug.log,确认是否真的触发
查看cron日志定位具体失败原因
系统日志是排查的核心依据。默认情况下,cron操作会记录到syslog中。
- 启用cron日志(如未开启):编辑
/etc/rsyslog.d/50-default.conf,取消注释cron.*行,然后重启:sudo systemctl restart rsyslog - 实时查看日志:
sudo tail -f /var/log/syslog | grep CRON(Ubuntu/Debian)或sudo journalctl -u cron -f(systemd系统) - 常见日志线索:
"(CRON) INFO (pid XXXXX, cmd '/xxx')" → 任务已调度
"Permission denied" → 权限或用户限制
"bad command" → crontab语法错误
"not found" → 命令不在PATH中或脚本路径错误










