我在另一篇文章中概述了我的小项目 - 再次快速总结一下,我正在努力做到以下几点:
我熟悉R网络抓包(rvest,rselenium)用于做第一颗子弹。对于第二个子弹,就在今天我学会了如何创建一个crontab来运行我的脚本,但是当我的计算机关闭时,crontab不会运行脚本,或者我已经阅读了。
如何在计算机关闭的情况下运行crontab?我有点(不是真的)熟悉EC2实例,但是如果我在EC2实例中有我的R脚本,我可以为那里的脚本安排一个crontab然后它会在关闭我的电脑的情况下运行吗?
提前感谢您的帮助!
答案 0 :(得分:1)
由于cron是一个在实例上运行的服务,你不能让它为你启动EC2实例 - 它是一个catch-22。
您可以将EC2实例视为在其他人的酒窖中运行的计算机(至少大部分时间)。您不希望计算机在未打开时运行代码,而对于EC2实例则完全相同。
我建议您考虑这是否真的是您想要的设置,听起来我使用AWS Lambda结合亚马逊的托管数据存储(RDS,DynamoDB,SimpleDB,甚至是S3)。这里的缺点是你只能使用JavaScript,Python和Java,因此不能使用R(嗯,你可以,但它很麻烦,因为你必须在JS / Python / Java中打包所需的一切应用程序并从那里开始。)
如果您真的想在EC2实例上运行R脚本,可以使用lambda启动实例,然后从脚本中关闭它。只需确保您的实例未设置为在关闭时终止。
无论您选择哪条路径,都需要创建一个lambda并从scheduled CloudWatch Event运行它。
然后你只需要实现lambda,运行你的脚本或使用EC2 API来启动实例。
如果使用lambda启动EC2实例,则不应在实例上使用cron在特定时间运行脚本,而是run it on startup。然后你的脚本shut down the instance就完成了。
这是一个示例Python脚本,用于从lambda启动EC2实例以启动:
import logging
import boto3
# Set up logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Set up a boto session to get credentials and region
session = boto3.session.Session()
# Set up EC2
ec2 = session.resource("ec2")
# The instance to start
instance_id = "i-1234567890abcd"
def lambda_handler(event, context):
logger.info('Start handling event.')
logger.info('Starting instance ' + instance_id)
instance = ec2.Instance(instance_id)
response = instance.start()
try:
current_state = response['StartingInstances'][0]['CurrentState']
except (KeyError, IndexError) as e:
logger.warn('Unexpected response when starting instance: {}'.format(response))
else:
if current_state not in ('pending', 'running'):
logger.warn('Instance {} is in unexpected state {} after starting'.format(id, current_state))
else:
logger.info('Started instance ' + instance_id)