【问题标题】:have R halt the EC2 machine it's running on让 R 停止它正在运行的 EC2 机器
【发布时间】:2011-11-08 13:44:09
【问题描述】:

我有一些工作流程,我希望 R 在完成脚本后停止它正在运行的 Linux 机器。我可以想到两种类似的方法来做到这一点:

  1. 以root身份运行R,然后调用system("halt")
  2. 从根 shell 脚本运行 R(可以以任何用户身份运行 R 脚本)然后在 R 位完成后让 shell 脚本运行halt

还有其他简单的方法吗?

这里的用例是针对在 AWS 上运行的脚本,我希望实例在脚本完成后停止,这样我就不会为作业运行后的机器时间付费。我用于数据分析的实例是一个 EBS 支持的实例,因此我不想终止它,只需暂停即可。从实例内部发出停止命令与从 AWS 控制台发出停止/挂起的效果相同。

【问题讨论】:

  • 多么奇怪!我可以将我的一些代码发送给您,如果您能弄清楚如何使其stop 停止机器,我将非常高兴。 :)
  • 您能否澄清几点:(1) 您使用的是 EBS 还是 S3 支持的实例? (如果使用 EBS,您打算终止还是停止实例?) (2) R 是如何使用的?以交互方式、通过脚本、通过这些 Hadoop 包之一、通过实例“用户数据”或其他方式?
  • sudo make sandwich 的出色扩展,甚至可以清理厨房。不错。

标签: r amazon-ec2 amazon-web-services


【解决方案1】:

AFAIK 你提到的那些方式是唯一的。在任何情况下,脚本都必须以 root 身份运行才能关闭机器(如果您找到一种无需 root 即可执行此操作的方法,这可能是一种利用)。您要求一种更简单的方法,但 system("halt") 只是脚本末尾的附加行。

【讨论】:

    【解决方案2】:

    我对它的工作印象深刻。 (对于其他任何对实例可以自行停止感到惊讶的人,请参阅注释 1 和 2。)

    您也可以尝试“sudo halt”,因为您不需要以 root 用户身份运行,只要运行 R 的用户帐户能够运行 sudo。这在 EC2 上的许多 AMI 上很常见。

    注意什么构成了 R 退出的假设 - 信不信由你,可能会使 R 崩溃。最好有一个单独的脚本来监视 R pid,一旦该 PID 不再处于活动状态,就终止实例。在 R 内部执行此命令意味着如果 R 崩溃,它永远不会到达停止调用。如果您从另一个脚本中调用它,那也可能很危险。如果您对 Linux 非常了解,那么您正在寻找的是启动 R 时的 PID,您可以将其传递给另一个检查ps 的脚本,比如每 1 秒一次,然后在 PID 不再运行时终止实例。

    我认为更好的解决方案是使用 EC2 API 工具(有关文档,请参阅:http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/)来终止停止实例。这两者之间存在差异,并且您的实例是支持 EBS 还是支持 S3 很重要。您无需以 root 身份运行即可终止实例 - 您拥有私钥和证书这一事实向 Amazon 表明您是 BOSS,远高于仅对您的实例具有 root 访问权限的 hoi polloi。

    由于这些凭据可用于恶作剧,因此在从给定服务器运行 API 工具时要小心,您需要服务器上的证书和私钥。如果您遇到安全问题,这是一个坏主意。最好向主服务器发送消息并让它关闭实例。如果您在实例之间以任何方式设置了消息传递,这可以为您完成所有工作。


    注意 1:Eric Hammond reports halt 只会暂停 EBS 实例,因此您仍然需要支付存储费。如果您碰巧启动了很多这样的实例,这可能会使事情变得混乱。您最初的问题似乎不清楚您是要终止还是停止实例。他还有其他好的建议on this page

    注意 2:short thread on the EC2 developers forum 为 Linux 和 Windows 用户提供建议。

    注意 3:EBS 实例按部分小时计费,即使重新启动也是如此。 (请参阅this thread from the developer forum。)假设 R 进程不工作,自动挂起接近小时标记可能很有用,以防有人可能重新分配该实例的任务(即保存不重新启动)。其他需要考虑的有用工具:setTimeLimitsetSessionTimeLimit,以及各种检查点工具(我有一个 Q,mentions a couple)。如果代码可能表现不佳,使用自动终止很有用。

    注 4:我最近了解到包 fun 中的 shutdown 命令。这是多平台。评论见this blog post,代码为here。危险的东西,但如果你想适应 Windows,它可能会很有用。不过我没试过。


    更新 1。另外三个想法:

    • 您可以将.Last()runLast = TRUE 用于q()quit(),这可能会关闭实例。
    • 如果使用 littler 或通过 Rscript 调用脚本的脚本,则可以使用相同的命令行函数。
    • 我今天最喜欢的包tcltk2 有一个简洁的计时器机制,称为tclTaskSchedule(),可用于安排表达式的执行。然后你可能会在每小时间隔过去之前疯狂地执行一些东西。

    【讨论】:

    • 不...暂停会停止实例。至少我的实例是这样配置的:)
    • 请记住,我想“停止”而不是“终止”一个实例。我正在使用 EBS 支持的实例,所以我只想停止它以保留状态。如果我终止它,我将失去状态。
    • halt 应该可以解决问题,或者您可以使用ec2-stop-instances。我喜欢 Eric Hammond 通过at 命令提出的建议。
    【解决方案3】:
    system("echo 'rootpassword' | sudo halt")
    

    但是,缺点是脚本中的 root 密码为纯文本。

    【讨论】:

    • 注意:如果 AMI 或帐户未设置密码,则可能没有 root 密码。这就是拥有 17 吨加密密钥的美妙之处,以及掌握私钥、证书、RSA、x.509 等的乐趣。
    • 这是一个非常好的点迭代器。我用密码设置了我的分析实例,但这可能不需要这样。谢谢提醒。
    【解决方案4】:

    sudo 是一个选项——它允许您在不提示输入任何密码的情况下运行某些命令。只需在/etc/sudoers 中输入类似内容即可

    <username> ALL=(ALL) PASSWD: ALL, NOPASSWD: /sbin/halt
    

    (当然替换为运行 R 的用户的名称)和 system('sudo halt') 应该可以工作。

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 2013-09-08
      • 2016-03-17
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多