在日常的运维工作中,经常会发现一个脚本或者是命令在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
暂无评论