Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在计算机关闭的情况下运行cronjob(EC2实例)_R_Amazon Ec2_Cron - Fatal编程技术网

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

如何在计算机关闭的情况下运行cronjob(EC2实例),r,amazon-ec2,cron,R,Amazon Ec2,Cron,我在另一篇文章中概述了我的小项目——为了快速总结,我尝试做以下几点: 编写一个从网站提取数据的R脚本 安排R脚本每天同时自动运行 将R脚本的输出写入/附加到数据库 我熟悉R web抓取软件包(rvest、rselenium)来完成第一个项目。对于第二个项目,就在今天,我学习了如何创建crontab,以便在需要时运行脚本,但是当我的计算机关闭时,crontab不会运行脚本,或者我已经阅读了 我怎么能让crontab在我的电脑关机的情况下运行呢?我对EC2实例有点熟悉(不是很熟悉),但是如果我在

我在另一篇文章中概述了我的小项目——为了快速总结,我尝试做以下几点:

  • 编写一个从网站提取数据的R脚本
  • 安排R脚本每天同时自动运行
  • 将R脚本的输出写入/附加到数据库
我熟悉R web抓取软件包(rvest、rselenium)来完成第一个项目。对于第二个项目,就在今天,我学习了如何创建crontab,以便在需要时运行脚本,但是当我的计算机关闭时,crontab不会运行脚本,或者我已经阅读了

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


提前感谢您的帮助

由于cron是一个在实例上运行的服务,您不能让它为您启动EC2实例,这是一个第22条军规

您可以将EC2实例视为在其他人的地下室中运行的计算机(至少在大多数情况下)。您不会期望计算机在未打开的情况下运行代码,对于EC2实例来说也是如此

<>我建议你考虑一下这是否是你想要的设置,我觉得你可以和亚马逊的托管数据存储(RDS,DIAMODB,SimuldB,甚至S3)结合起来更好的服务。这里的缺点是,您仅限于JavaScript、Python和Java,因此不能使用R(当然,您可以,但这很麻烦,因为您必须将所需的一切打包到JS/Python/Java应用程序中,然后从那里开始)

如果您真的想在EC2实例上运行R脚本,可以使用lambda启动实例,然后从脚本中关闭它。只需确保实例未设置为在关闭时终止

无论您选择了什么路径,都需要创建lambda并从服务器运行它

然后,您只需要实现lambda,运行脚本或使用ec2api来启动实例

如果使用lambda启动EC2实例,则不应在实例上使用cron在特定时间运行脚本,而应使用cron。然后,当脚本完成时,您就有了脚本

下面是一个示例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)

我发布了很多类似的问题,我知道这些问题都离题了,因为它们不是特定于编程的。请让我知道是否有更好的地方张贴这些,我会的。谢谢是的,你能做到
ssh
到您的ec2,使用
scp
yourscript.R
复制到ec2,使用例如
apt get install
在ec2上安装
R
,并使用
crontab-e
进行计划,例如
Rscript yourscript.R>yourscript.R.log 2>yourscript.R.err
数据库是否在本地计算机上?如果要在机器停止时运行脚本,脚本将如何写入数据库?你的问题定义不完整。我还没有达到要点3,还没有启动数据库-你的评论让我认为,如果我想让所有这些都在本地计算机关闭的情况下工作,数据库将需要在云中,对吗?我不能简单地让实例随时启动并运行吗?非常感谢您对这方面的一些数据库建议。我正在使用我能使用的最小实例,t2.micro和Amazon Linux AMI(这是描述实例的正确方式吗)-这是免费的第一层,所以我可以让它一直免费运行,不是吗?你可以让t2.micro在免费层上运行一年,虽然这不是最漂亮的解决方案——特别是取决于脚本运行的频率,但如果这是最简单的解决方案,我会选择它。