我有一些工作流程,我希望R在完成脚本后暂停运行的Linux机器。我可以想到两种类似的方法:
system("halt")
halt
。 还有其他简单的方法吗?
此处的用例适用于在AWS上运行的脚本,我希望在脚本完成后停止实例,这样我就不会在作业运行后收取机器时间费用。我用于数据分析的实例是一个EBS支持的实例,因此我不想终止它,只需暂停。从实例内部发出halt命令与从AWS控制台停止/挂起的效果相同。
答案 0 :(得分:8)
我印象深刻,有效。 (对于其他任何一个实例可以自行停止的人,请参阅注释1和2。)
您也可以尝试“sudo halt”,因为只要运行R的用户帐户能够运行sudo,您就不需要以root用户身份运行。这在EC2上的很多AMI上很常见。
小心R退出的假设 - 不管你信不信,可以崩溃R.最好有一个单独的脚本来监视R pid,一旦PID不再有效,就终止了实例。在R内执行此命令意味着如果R崩溃,它永远不会到达停止的调用。如果你从另一个脚本中调用它,那也可能是危险的。如果你对Linux了解得很清楚,那么你要找的是启动R的PID,你可以将其传递给另一个检查ps
的脚本,比如说每1秒一次,然后在PID不再存在时终止实例运行
我认为更好的解决方案是使用EC2 API工具(请参阅:http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/获取文档)来终止 OR 停止实例。这两者之间存在差异,如果您的实例是EBS支持或S3支持则很重要。您不需要以root用户身份运行以终止实例 - 事实上,您拥有私钥和证书会向亚马逊显示您是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进程不工作,如果有一个可能重新执行该实例(即保存不重启),那么自动暂停接近小时标记会很有用。需要考虑的其他有用工具:setTimeLimit
和setSessionTimeLimit
,以及各种检查点工具(我有一个Q mentions a couple)。如果一个人的代码可能性能很差,那么使用auto-kill非常有用。
注4:我最近在包shutdown
中学到了fun
命令。这是多平台的。有关评论,请参阅this blog post,代码为here。危险的东西,但如果你想适应Windows,它可能是有用的。不过我还没试过。
更新1.还有三个想法:
.Last()
和runLast = TRUE
用于q()
和quit()
,这可能会关闭实例。 tcltk2
有一个简洁的计时器机制,称为tclTaskSchedule()
,可用于安排表达式的执行。然后,你可能会在每小时间隔过去之前就执行一些东西而疯狂。答案 1 :(得分:1)
system("echo 'rootpassword' | sudo halt")
然而,缺点是在脚本中以纯文本形式提供root密码。
答案 2 :(得分:0)
AFAIK你提到的那些方式是唯一的。在任何情况下,脚本都必须以root身份运行才能关闭计算机(如果你找到了一种没有root的方法,那可能是一个漏洞)。你要求一种更简单的方法,但系统("暂停")只是你脚本末尾的另一行。
答案 3 :(得分:0)
sudo
是一个选项 - 它允许您在不提示任何密码的情况下运行某些命令。在/etc/sudoers
<username> ALL=(ALL) PASSWD: ALL, NOPASSWD: /sbin/halt
(当然替换为运行R的用户名)和system('sudo halt')
应该可以正常工作。