写点什么

定时任务 Crontab 中的特殊字符

用户头像
耳东@Erdong
关注
发布于: 2 小时前

最近在备份文件的时候遇到了问题,备份的命令如下:


0 0 * * * /usr/bin/rsync -aP /var/logs/es_index_search_slowlog-`date -d "1 day ago" "+%Y-%m-%d"`.log root@x.x.x.x:/opt/data/logs >> /tmp/log.txt 2>&1
复制代码


在使用上述命令进行定时同步文件进行备份的时候发现,Crontab 里的任务无论如何都不执行,但是将该命令放在脚本中是可以执行的。经过排查,已经排除了是环境变量不同导致的问题。


在继续查找资料的时候发现是 % 的问题。


%(百分号)在 crontab 中是一个特殊字符,相当于回车,如果在命令(command)字段中包含 %,那么只有第一个百分号前的文本才会包含在实际命令中,之后的内容将作为标准输入赋值给前面的命令。如果命令行中需要 %,必须得在 %前面加一个反斜线""来转义,即“%”, 如


在 Linux 系统中执行 man 5 crontab 就可以找到如下描述。


       The  "sixth"  field  (the rest of the line) specifies the command to be       run.  The entire command portion of the line, up  to  a  newline  or  %       character, will be executed by /bin/sh or by the shell specified in the       SHELL variable of the cronfile.   Percent-signs  (%)  in  the  command,       unless escaped with backslash (\), will be changed into newline charac-       ters, and all data after the first % will be sent  to  the  command  as       standard input.
复制代码


翻译过来就是


第六个域(行的剩余部分)指明了要运行的命令。一行中整个命令部分遇到一个换行符或%结束,命令会以/bin/sh执行或以cron文件中 SHELL变量指明的shell执行。命令中的百分号(%) ,除非以反斜线 “\” 转义,否则会被转换为换行符,第一个%后的所有数据会被发送给命令作为标准输入,
复制代码


发布于: 2 小时前阅读数: 2
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
定时任务 Crontab 中的特殊字符