如何在关闭计算机的情况下运行cronjob(EC2实例)

时间:2017-08-24 19:45:40

标签: r amazon-ec2 cron

我在另一篇文章中概述了我的小项目 - 再次快速总结一下,我正在努力做到以下几点:

  • 编写一个从网站提取数据的R脚本
  • 将R脚本安排为每天自动同时运行
  • 将R脚本的输出写入/附加到数据库

我熟悉R网络抓包(rvest,rselenium)用于做第一颗子弹。对于第二个子弹,就在今天我学会了如何创建一个crontab来运行我的脚本,但是当我的计算机关闭时,crontab不会运行脚本,或者我已经阅读了

如何在计算机关闭的情况下运行crontab?我有点(不是真的)熟悉EC2实例,但是如果我在EC2实例中有我的R脚本,我可以为那里的脚本安排一个crontab然后它会在关闭我的电脑的情况下运行吗?

提前感谢您的帮助!

1 个答案:

答案 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)