概述
因为cron从非交互式、非登录 shell 运行作业。所以当cron执行作业时,它不会从~/.bashrc、~/.bash_profile、/etc/profile 等文件加载环境变量。当我们需要使用容器内的环境变量作为参数定时运行shell脚本时,由于无法读取环境变量导致运行失败。
以下为docker容器的解决方案
解决方案
-
保存容器环境变量(可以写在entrypoint中)
通过declare命令和grep命令捕获你所需要的环境变量至/container.env文件中(当然,这个文件你可以随意定义)
1
declare -p | gerp -E 'VAR1|VAR2|VAR2' > /container.env
-
运行时载入环境变量配置文件
有两种方式载入。
-
通过需要执行的shell脚本载入,只需在shell脚本前加入即可
1
2
3
4!/bin/bash
读取容器设定的环境变量
source /container.env -
直接在crontab中载入
1
2
3SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * root /test-cron.sh
-
cron注意事项
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量
- 脚本中涉及文件路径时写全局路径(如python 通过which python 定位其全局路径再填入)
- 脚本执行其他环境变量时,通过source命令引入环境变量
- 当手动执行脚本OK,但是crontab执行失败时。很有可能环境变量出问题