2012年8月1日星期三

Linux经验谈之一------Crontab中的百分号(%)转义

crontab是Linux系统中不可或缺的一部分,尤其是用于server环境中的Linux系统,更是一点都少不了,通过它来按时调度其各个的任务,而无需人工参与,最终完成任务,真是居家必备之良品,你,值得拥有。
今天说的不是crontab的具体用法,而是在日常使用中的一个小点,而且很不显眼的,很容易栽跟头的,下面不扯淡了,进入正题。

我们使用crontab时候很多任务都想要把输出的日志重定向到某个文件,而这个文件是与具体的时间相关的,如按天的,或者小时的,文件名称大致如此类
process_log.2012-08-01
process_log.20120801等
而上面的日期则大部分使用强大的date命令来生成,date +"%Y%m%d",大抵诸如此类的
当将上面结合要执行的命令,放在crontab中使用的时候,如果不注意会出现一些小的问题,示例如下
0 10 * * * bash process.sh >> ~user/log/process_log.$(date +"%Y%m%d")
如果配置了以上的指令,到10点的时候,会发现不存在上面的日志文件,也就是程序没有按照料想的方式运行,这是怎么回事呢?

察看crontab的执行log,会发现上面的执行记录大致是这样的
 CMD   bash process.sh >> ~user/log/process_log.$(date +"
也就是到百分号的地方,断掉了。

这时候,我们查一下crontab的man手册,会发现有这么一段
      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 crontab file.  Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to  the  command as standard input. There is no way to split a single command line onto multiple lines, like the shell's trailing "\".
第六个字段,定义了将要被执行的命令,从开始直到一个换行符或者%为止的部分将作为一条整个命令,将要被/bin/sh 或者在在crontab文件中被定义的SHELL变量所执行,在命令里的百分号(%),除非被反斜线(\)转义,将被改成换行符,并且在%之后的所有数据,会作为执行命令的标准输入,crontab中是没有像shell中的尾随符号"\"一样,可以将一个命令行分割成多行的办法。

所以,我们的日期中的%被换行了,通过上面的手册,我们也找到了相应的解决办法。那就是转义。
0 10 * * * bash process.sh >> ~user/log/process_log.$(date +"\%Y\%m\%d")
这样就可以了。

在网络中看到有人说用单引号在某些系统上是不用转义的,但是经过我在两个不同的系统上测试,单引号都是必须要加上转义才可以,总之是加上转义是肯定不会有问题的。

没有评论:

发表评论