我有一个非常基本的python脚本,它使用boto
来查询我的EC2实例的状态。当我从控制台运行它时,它工作正常,我很高兴。问题是当我想添加一些自动化并通过crond
运行脚本时。我注意到脚本挂起并无限期地等待连接。我看到boto
有这个问题,有些人建议在boto
配置文件中添加一些超时值。我无法理解如何以及在哪里,我添加了手动/etc/boto.cfg
文件与建议的超时值(5),但它没有帮助。使用strace
,您可以看到永远不会访问此配置文件。有关如何解决此问题的任何建议吗?
答案 0 :(得分:3)
您的cron环境很可能与登录提示的交互式shell不够接近。
在cron的环境中,并不总能找到路径和诸如.boto或boto.cfg文件之类的东西。此外,在某些系统(ubuntu)上,cron运行为DASH而不是BASH,因此事情也会有所不同。
如果您正在编写脚本,请尝试获取/etc/boto.cfg文件或设置AWS环境变量以确保其使用正确的设置
更好的是 - 将它们读入你的python脚本,使其可移植,而不是依赖于env。 VARS。
from ConfigParser import ConfigParser, NoOptionError, NoSectionError
from boto.s3.connection import S3Connection
try:
config = ConfigParser()
config.readpf(open('/etc/boto.cfg', 'rb'))
aws_seckey = config.get('Credentials', 'aws_secret_access_key')
aws_keyid = config.get('Credentials', 'aws_access_key_id')
conn = S3Connection(aws_keyid, aws_seckey)
except (IOError, NoSectionError, NoOptionError):
conn = S3Connection() # try env if /etc/boto.cfg missing
except:
raise
或类似的东西。关键是要读取配置而不是假设环境。
答案 1 :(得分:1)
整个问题似乎是HTTP_PROXY环境变量。该变量在/etc/bashrc
中设置,并且所有用户都以这种方式获得它,但是当cron作业运行时(以root身份),{_ 1}}未被读取且变量未设置。通过将变量添加到/etc/bashrc
的配置文件(通过crond
),问题就解决了