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

Connection with boto to AWS hangs when running with crond

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

很有可能您的 cron 环境与登录提示的交互 shell 不够接近。

路径和诸如 .boto 或 boto.cfg 文件之类的东西并不总能在 cron 环境中找到或位于同一位置。此外,在某些系统 (ubuntu) 上,cron 以 DASH 而不是 BASH 运行,因此情况也会有所不同。

如果您正在运行脚本,请尝试获取 /etc/boto.cfg 文件或设置 AWS 环境变量以确保它使用正确的设置

更好的是 - 将它们读入您的 python 脚本,使其可移植且不依赖于环境。变量

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

或类似的东西。关键是阅读配置而不是假设环境。

整个问题似乎是 HTTP_PROXY 环境变量。该变量是在 /etc/bashrc 中设置的,所有用户都是通过这种方式获得的,但是当 cron 作业 运行(作为 root)/etc/bashrc 未被读取且该变量未被设置时。通过将变量添加到 crond 的配置文件(通过 crontab -e),问题得到解决