EC2中使用Crontab调度Python脚本时环境变量KeyError问题求助
解决Cron任务无法读取环境变量的问题
核心原因
Cron运行的是非交互式、非登录Shell,不会自动加载~/.bashrc这类交互式Shell的配置文件,所以你在.bashrc里设置的环境变量对Cron任务不可见。
解决方法
方法1:在Cron任务行直接导出环境变量
直接在Cron命令前添加export语句,把需要的变量传给后续的Python脚本:
*/5 * * * * export GOOGLE_APPLICATION_CREDENTIALS="/home/ubuntu/.hiddendirectory/keyfile.json" && export AWS_ACCESS_KEY_ID="你的AWS密钥ID" && export AWS_SECRET_ACCESS_KEY="你的AWS密钥"; /usr/bin/python3 /home/ubuntu/Python/function.py args >> /var/log/logfile.log 2>&1
方法2:通过环境变量文件统一加载
- 创建一个专门存放环境变量的文件(比如
~/.cron_env),写入需要的变量:# ~/.cron_env export GOOGLE_APPLICATION_CREDENTIALS="/home/ubuntu/.hiddendirectory/keyfile.json" export AWS_ACCESS_KEY_ID="你的AWS密钥ID" export AWS_SECRET_ACCESS_KEY="你的AWS密钥" - 修改Cron任务,先加载这个文件再执行脚本:
注意这里必须用文件的绝对路径,因为Cron的默认工作目录不一定是用户家目录。*/5 * * * * source /home/ubuntu/.cron_env && /usr/bin/python3 /home/ubuntu/Python/function.py args >> /var/log/logfile.log 2>&1
方法3:在Crontab配置开头定义环境变量
直接在crontab -e编辑的内容最上方添加变量定义,Cron会自动把这些变量传给所有任务:
# Crontab配置开头添加 GOOGLE_APPLICATION_CREDENTIALS="/home/ubuntu/.hiddendirectory/keyfile.json" AWS_ACCESS_KEY_ID="你的AWS密钥ID" AWS_SECRET_ACCESS_KEY="你的AWS密钥" # 你的定时任务 */5 * * * * /usr/bin/python3 /home/ubuntu/Python/function.py args >> /var/log/logfile.log 2>&1
额外提示(针对AWS凭证)
除了环境变量,你也可以确保Cron运行的用户(这里是ubuntu)的~/.aws/credentials文件存在且权限正确(建议设置为chmod 600 ~/.aws/credentials),botocore会自动读取这个文件里的凭证,无需额外设置环境变量。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

