为什么crontab不执行
影响因素一·环境变量
cron中的环境变量和系统的环境变量是不一样的,我们可以通过设置定时脚本将cron中的环境变量打印出来:
* * * * * env > /tmp/env.output可以看到cron中的环境变量:
XDG_SESSION_ID=12952
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env查看系统的环境变量:
[root@tony cron.d]# env
XDG_SESSION_ID=1140
HOSTNAME=tony
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/etc/cron.d
LANG=en_US.UTF-8
TMUX_PANE=%18
HISTCONTROL=ignoredups
SHLVL=2
HOME=/root
LOGNAME=root
_=/usr/bin/env
OLDPWD=/root我们可以看到cron中的环境变量很多都和系统环境变量不一样,尤其是PATH,只有/usr/bin:/bin,也就是说在cron中运行shell命令,如果不是全路径,只能运行/usr/bin或/bin这两个目录中的标准命令,而像/usr/sbin、/usr/local/bin等目录中的非标准命令是不能运行的。
解决方法
在cron脚本文件头部声明PATH
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows影响因素二·shell 解释器
从因素1就知道cron环境变量中的SHELL是sh而不是bash,我们知道很多shell命令是可以在bash中正常运行,但是不能在sh中运行的,所以这个因素也会影响定时任务的正常运行。
解决方法
修改cron中的SHELL环境变量的值,让所有命令都用bash解释器:
SHELL=/bin/bash影响因素三·百分号%
当cron定时执行命令中,有百分号并且没有转义的时候,cron执行会出错,比如执行以下cron:
0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log这是因为在cron中换行符或%前的命令会被shell解释器执行,但是%会被认为新一行的字符,并且%后所有的数据都会以标准输出的形式发送给命令。
解决方法
为百分号做转义,即在%前添加反斜杠\
本文来源:https://www.tony-yin.site/2018/10/29/Why-Crontab-Not-Work/
评论已关闭