最近工做须要,须要定时执行命令文件,而且把执行的日志重定向输出到以日期命名的文件中,命令以下:shell
/bin/bash /data/shell/merge.sh &>> /data/shell/merge-`date +"%F"`.log 2>&1bash
单独执行这条命令执行正常less
而后把命令添加到Linux的定时任务,天天凌晨02:30执行一次定时任务:crontab -lui
30 2 * * * /bin/bash /data/shell/merge.sh &>> /data/shell/merge-`date +"%F"`.log 2>&1翻译
次日检查发现定时任务执行失败,查看日志 /var/log/cron:rest
Feb 21 02:30:01 iZbp1cs0fu03n6k79ztuipZ CROND[27824]: (root) CMD (/bin/bash /data/shell/merge.sh &>> /data/shell/merge-`date +")日志
从执行日志发现cmd 从中间截断了,命令没有正常执行;crontab
结合输出日志发现错误日志显示了上面的脚本在 `date +" 以后就被截断了,出现了语法错误。ip
查看manpage,发现这么一句话:ci
The "sixth" field (the rest of the line) specifies the command to be run.
The entire command portion of the line, up to a new‐line or a "%" character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile.
A "%" character in the command, unless escaped with a backslash (\), will be changed into newline characters, and all data after thefirst % will be sent to the command as standard input.
以后肯定原来是 % 这个符号在crontab里面被翻译成了命令结束,因此当crontab读到%就吧后面的内容截取掉了,致使脚本执行失败。 在%前面加上转移符号"\"便可,以下
30 2 * * * /bin/bash /data/shell/merge.sh &>> /data/shell/merge-`date +"\%F"`.log 2>&1
检查日志看到定时任务执行成功:
Feb 22 02:30:01 iZbp1cs0fu03n6k79ztuipZ CROND[31285]: (root) CMD (/bin/bash /data/shell/merge.sh &>> /data/shell/merge-`date +"%F"`.log 2>&1)