问题出现得很突然,日志倒是留得挺全。定时任务里用了带格式的日期命令,手动执行正常,放到任务列表里就报错,参数莫名其妙少了一半。
把日志和配置对完,能解释这个现象的基本就这几处。百分号在任务定义里是换行符,必须转义。少数情况下是命令里的引号被解析后丢失。
不容易想到的是,日期格式里的空格被当成了命令分隔。
第一件事是确认任务原文
crontab -l | grep job
接着把百分号转义
0 2 * * * /bin/bash /opt/job.sh >> /tmp/job_$(date +\%F).log 2>&1
或者把逻辑写进脚本
cat /opt/job.sh
剩下的就是执行后观察一次日志
tail -f /var/log/cron
别只看报错消失,验证要多做一步。任务按预期生成带日期的日志文件,命令参数完整,不再报错。
这里还有个坑。把复杂命令包进脚本最省心,任务列表里只留一行调用,转义问题自然就消失了;脚本里再统一处理日期格式,以后换机器也不用重改。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。