影响因素一·环境变量

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环境变量中的SHELLsh而不是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/

标签: none

评论已关闭