crontab中的两个坑

在日常的运维工作中,经常会发现一个脚本或者是命令在shell里面运行正常,但是放到crontab中就会发生一些问题,导致执行失败。

1、环境变量的问题

1.1、shell中的环境变量

这里只摘录了一部分输出

$ printenv 
HOSTNAME=leidy_123
TERM=xterm
SHELL=/bin/bash
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PWD=/root
LANG=en_US.UTF-8
HOME=/root
LOGNAME=root

1.2、crontab中的环境变量

$ cat /etc/crontab
...
* * * * * root (printenv >> /tmp/printenv.txt)
...

$ cat /tmp/printenv.txt
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/usr/bin/printenv

这里我们发现PATH变量是不同的,导致crontab执行的时候,脚本中不在crontab的环境变量,而且也没有写全路径的命令会提示:command not found

1.1.3、解决方案

  • 脚本中命令写全路径,或者开头加上一下代码:
source /etc/profile

  • 修改crontab的PATH变量:
$ cat /etc/crontab | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

2、%引发的问题

示例:

$ cat /etc/crontab
* * * * * root (date "+%Y%m%d" >> /tmp/date.log 2>&1)

$ tail -f /var/log/cron
Nov 24 11:17:01 leidy_123 CROND[18462]: (root) CMD ((date "+)

这里我们发现命令执行失败了,在出现%的位置命令被截断了,通过查阅crontab的man page我们会发现有这么一段话:

$ 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  cron-
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.

解决方案:

在crontab中%是有特殊含义的,在不使用转义符(\)时,%被当成换行符

$ cat /etc/crontab 
* * * * * root (date "+\%Y\%m\%d" >> /tmp/date.log 2>&1)

$ tail -f /var/log/cron | grep date
Nov 24 11:24:01 leidy_123 CROND[19578]: (root) CMD ((date "+%Y%m%d" >> /tmp/date.log 2>&1))

$ cat /tmp/date.log
20161124

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload CAPTCHA.