在使用crontab时遇到的环境变量问题表现为: 在shell中能正常执行的脚本,但是通过crontab任务调度时就提示命令不存在:

产生该问题的本质原因是:crontab任务在执行时所能读取到环境变量与用户登录后所读取到到的环境变量是不同的。 用户登录shell后所能读取到的环境变量通常定义在如下几个地方:~/.bashrc/etc/profile,而crontab定时任务所能读取到的环境变量是定义在 /etc/crontab中的。

如下是我的Linux主机的/etc/crontab内容:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

如上所示,crontab任务所能读取到的PATH变量在如下路径中:/sbin:/bin:/usr/sbin:/usr/bin 。 也就是说在crontab任务中运行的命令都需要在这些路劲下,否则就会提示路径找不到的报错信息。

解决办法如下:

1,将所有使用的非bash内置命令都改为绝对路径调用

# 例如:
# 原来的python3,改为/home/user/python3/python3

# python3 python.py
/home/user/python3/python3 python.py

2,在脚本开头先加载环境变量

# 将需要用到的命令加到环境变量中
export PATH=$PATH:/usr/local/bin/python3
# 再执行命令
...

3,将/usr/local/bin/python3 添加到/etc/profile或者~/.bashrc中,然后在crontab任务的执行命令中动态加载环境变量

source /etc/profile
source /home/appadmin/.bash_profile