Python 使用crond运行时,boto与AWS的连接挂起

Python 使用crond运行时,boto与AWS的连接挂起,python,amazon-web-services,amazon-ec2,cron,boto,Python,Amazon Web Services,Amazon Ec2,Cron,Boto,我有一个非常基本的python脚本,它使用boto来查询EC2实例的状态。当我从控制台运行它时,它运行良好,我很高兴。问题是当我想添加一些自动化并通过crond运行脚本时。我注意到脚本挂起并无限期地等待连接。我看到boto有这个问题,有些人建议给botoconfig文件添加一些超时值。我无法理解如何以及在何处,我手动添加了带有建议超时值(5)的/etc/boto.cfg文件,但没有任何帮助。使用strace可以看到此配置文件从未被访问。有什么建议可以解决这个问题吗?很可能您的cron环境与登录提

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

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

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

如果要对脚本进行cron,请尝试获取/etc/boto.cfg文件的源代码或设置AWS环境变量,以确保它使用了正确的设置

更好的方法是将它们读入python脚本中,使其可移植且不依赖于env。瓦尔斯

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

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

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

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

如果要对脚本进行cron,请尝试获取/etc/boto.cfg文件的源代码或设置AWS环境变量,以确保它使用了正确的设置

更好的方法是将它们读入python脚本中,使其可移植且不依赖于env。瓦尔斯

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\U代理环境变量。变量是在
/etc/bashrc
中设置的,所有用户都是通过这种方式获得的,但是当cron作业以root身份运行时,
/etc/bashrc
没有被读取,并且变量也没有设置。通过将变量添加到
crond
(通过
crontab-e
)的配置文件中,问题得以解决

整个问题似乎是HTTP\U代理环境变量。变量是在
/etc/bashrc
中设置的,所有用户都是通过这种方式获得的,但是当cron作业以root身份运行时,
/etc/bashrc
没有被读取,并且变量也没有设置。通过将变量添加到
crond
(通过
crontab-e
)的配置文件中,问题得到了解决

,因此我想您的答案已经足够接近了。当每个用户登录到系统时,都会为其定义环境变量http_proxy,但cron守护进程无法获取该变量。如果您确定环境变量的来源(例如/etc/profile、/etc/bashrc、/etc/profile.d/http_proxy…)然后,您可以在cron.d脚本中找到它的来源,或者-您可以在cron命令中设置变量,例如,您可以在/etc/cron.d中放置一个文件,并使http_proxy=''-或-/etc/profile.d/proxy。man 5 crontab将提供帮助(参见示例),我只需使用
os.environ['http_proxy']
在python脚本中设置它,它工作得很好,我不需要再担心它了。每当脚本运行时,它都会确保变量的设置与它运行的上下文无关,所以我猜您的答案足够接近了。当每个用户登录到系统时,都会为其定义环境变量http_proxy,但cron守护进程无法获取该变量。如果您确定环境变量的来源(例如/etc/profile、/etc/bashrc、/etc/profile.d/http_proxy…)然后,您可以在cron.d脚本中找到它的来源,或者-您可以在cron命令中设置变量,例如,您可以在/etc/cron.d中放置一个文件,并使http_proxy=''-或-/etc/profile.d/proxy。man 5 crontab将提供帮助(参见示例),我只需使用
os.environ['http_proxy']
在python脚本中设置它,它工作得很好,我不需要再担心它了。每当脚本运行时,它都会确保设置变量,而不管它从哪个上下文运行