与crond一起运行时,与boto到AWS的连接挂起

时间:2015-04-01 16:23:02

标签: python amazon-web-services amazon-ec2 cron boto

我有一个非常基本的python脚本,它使用boto来查询我的EC2实例的状态。当我从控制台运行它时,它工作正常,我很高兴。问题是当我想添加一些自动化并通过crond运行脚本时。我注意到脚本挂起并无限期地等待连接。我看到boto有这个问题,有些人建议在boto配置文件中添加一些超时值。我无法理解如何以及在哪里,我添加了手动/etc/boto.cfg文件与建议的超时值(5),但它没有帮助。使用strace,您可以看到永远不会访问此配置文件。有关如何解决此问题的任何建议吗?

2 个答案:

答案 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),问题就解决了