在crontab中使用含%的date命令需对每个%转义为\%,如date +\%y\%m\%d;须用绝对路径、避免不可见字符、加日志重定向,并通过即时测试验证。

在 crontab 中直接写 date +%Y%m%d 这类含 % 的命令会静默失败,不是 date 本身出错,而是 crontab 把 % 当作特殊分隔符处理——它会把第一个 % 及之后的内容当成标准输入,导致命令被截断。解决方法很简单:所有 % 都必须用反斜杠 \ 显式转义,一个都不能漏。
每个 % 都要单独加反斜杠
crontab 不认“只转义第一个”,也不接受“%Y%m%d”整体转义。必须逐个处理:
- 错误写法:
date +%Y%m%d、$(date +%F)、`date +\%Y%m%d` - 正确写法:
date +\%Y\%m\%d、$(date +\%F)、`date +\%Y\%m\%d` - 带时分秒也一样:
$(date +\%Y\%m\%d\%H\%M\%S)
优先用 $() 替代反引号
反引号(``)容易嵌套混乱且已逐步淘汰,推荐统一用 $() 执行子命令:
- 更清晰:
echo "backup_$(date +\%Y\%m\%d).tar.gz" - 易维护:多层嵌套不会乱,比如
$(basename $(dirname /path/to/file))也能安全混用 - 避免引号干扰:反引号里若含空格或特殊字符,常需额外转义;
$()天然更健壮
配套细节必须同步检查
光转义 % 不够,下面三点漏掉任一都可能让任务不执行:
-
用绝对路径调用命令:crontab 默认 PATH 极窄(通常只有
/usr/bin:/bin),建议写/usr/bin/date而非date;其他工具如/usr/bin/python3、/usr/bin/mysqldump同理 -
清除不可见字符:从网页或文档复制命令时,易混入全角空格、中文引号或换行符,可用
:set list在 vim 中查看,或重打一遍关键符号 -
加日志重定向排查:在命令末尾加上
> /tmp/cron_debug.log 2>&1,执行后直接看日志内容,比等定时触发快得多
快速验证是否生效
别等明天,一分钟内就能确认:
- 执行
crontab -e,添加测试行:* * * * * /usr/bin/date +\%F\ \%T >> /tmp/crontab_test.log 2>&1 - 等 60 秒,运行
tail -1 /tmp/crontab_test.log - 看到类似
2026-07-21 09:05:01就说明转义和执行都正常;如果文件为空,去查/var/log/cron,出现date +这种截断记录,就是还有 % 没转义干净











