2011-09-01 8 views
6

スクリプトの完了後に実行中のLinuxマシンを停止させるために、Rにいくつかの作業フローがあります。 (任意のユーザとしてRスクリプトを実行できる)、シェルスクリプトを持ってrootとしては、実行中のEC2マシンを停止しています

  1. 、ランRと、ルートシェルスクリプトからsystem("halt")
  2. 、ランRを呼び出す:私はこれを行うには、2つの類似した方法を考えることができますRビットが完了した後にhaltを実行してください。

他の簡単な方法がありますか?

ここでの使用例は、AWSで実行されているスクリプトの場合です。スクリプトの完了後にインスタンスを停止して、ジョブ実行後の機械時間に課金されないようにします。データ分析に使用するインスタンスはEBSでサポートされているインスタンスなので、終了する必要はありません。単に中断します。インスタンス内部から停止コマンドを発行することは、AWSコンソールからの停止/中断と同じ効果です。

+3

どのように奇妙な!私はあなたに私のコードをいくつかお送りすることができます。もしあなたがマシンを停止する*方法を見つけ出すことができれば、私はとても幸せになれます。 :) – Iterator

+0

いくつかのことを明確にすることができますか?(1)EBSまたはS3をサポートしているインスタンスを使用していますか? (EBSを使用している場合は、インスタンスを終了または停止しますか?)(2)Rはどのように使用されていますか?対話的に、スクリプトを介して、これらのHadoopパッケージの1つを介して、インスタンス「ユーザデータ」、またはその他の手段を介して – Iterator

+2

キッチンをきれいにする 'sudo make sandwich 'の素晴らしい拡張。ニース。 –

答えて

8

私は感動しています。インスタンスが停止する可能性があることに驚いている人は、ノート1 &を参照してください。

rootユーザーとして実行する必要はないので、 "sudo halt"を試すこともできますRを実行しているアカウントはsudoを実行できます。これはEC2の多くのAMIでよく見られます。

R終了の前提となるものに注意してください。信じていてもいなくても、Rがクラッシュする可能性があります.R PIDを監視し、PIDがアクティブになっていなくても終了するインスタンス。 Rの内部でこのコマンドを実行すると、Rがクラッシュした場合、停止する呼び出しには到達しません。別のスクリプトの中から呼び出すと、それも危険です。もしあなたがLinuxをよく知っているなら、あなたが探しているものはRを始めるときのPIDです。psをチェックする別のスクリプトに渡すことができます。そして1秒ごとにそうします。

もっと良い解決策は、または停止インスタンスを終了するために、EC2 APIツール(ドキュメント:http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/参照)を使用することです。これらの2つの間には違いがあります。インスタンスがEBSにバックアップされている場合、またはS3がバックアップされている場合は重要です。インスタンスを終了するためにrootとして実行する必要はありません。秘密鍵と証明書を持っているということは、あなたのインスタンスにrootアクセス権を持つホーポロイの上にあるBOSSのアマゾンを示しています。

これらの資格情報はいたずらに使用される可能性があるため、特定のサーバーからAPIツールを実行する場合は、サーバー上に証明書と秘密キーが必要です。セキュリティ上の問題がある場合、それは悪い考えです。マスターサーバーにメッセージを送り、インスタンスをシャットダウンする方が良いでしょう。インスタンス間でメッセージングを設定している場合は、すべての作業を行うことができます。


注1:エリック・ハモンドreportsあなたはまだ保存料を持っているので、haltのみ、EBSのインスタンスを一時停止します。あなたがそのようなインスタンスの多くを開始する場合、これは物事を混乱させる可能性があります。あなたの元の質問は、あなたがインスタンスを終了するか停止することを意味するかどうかは不明です。彼は他の良いアドバイスを持っていますon this page

注2:は、Windowsユーザー向けに&をアドバイスします。

注3:EBSインスタンスには、再起動しても部分的な時間が請求されます。 (this thread from the developer forumを参照してください)Rプロセスが動作していないと仮定して、そのインスタンスを再タスクする(再起動しないで保存する)場合に備えて、時間マークに近い自動サスペンドを使用すると便利です。検討するその他の便利なツール:setTimeLimitsetSessionTimeLimit、およびさまざまなチェックポイントツール(Qはmentions a coupleです)。 auto-killを使用すると、コードの動作が悪くなる可能性がある場合に便利です。

注4:私は最近、shutdownコマンドをfunというパッケージで知った。これはマルチプラットフォームです。解説はthis blog post、コードはhereです。危険なものですが、Windowsに適応したい場合には便利です。私はそれを試していない。


アップデート1.三つのより多くのアイデア:

  • あなたはインスタンスを停止可能性があり、q()quit()ため.Last()runLast = TRUEを使用することができます。
  • littlerまたはRscriptを使用してスクリプトを呼び出すスクリプトを使用する場合、同じコマンドライン関数を使用できます。
  • 今日の私のお気に入りのパッケージtcltk2には、式の実行をスケジュールするために使用することができるtclTaskSchedule()と呼ばれるきちんとしたタイマーメカニズムがあります。あなたは、時間間隔が過ぎる直前に物事を実行すると狂ってしまうことがあります。
+0

nope ... haltingはインスタンスを停止します。少なくともそれは私のインスタンスが設定されている方法です:) –

+0

私はインスタンスを "終了"しないで "停止"したいということに留意してください。私はEBSを使用しているので、状態を保存するために停止したいだけです。私がそれを終了すると、私は状態を失うだろう。 –

+0

'halt'はこのトリックを行うべきです、あるいは' ec2-stop-instances'を使うことができます。私はEric Hammondが 'at'コマンドで示唆しているものが好きです。 – Iterator

0

AFAIKあなたが言及した方法は唯一のものです。いずれにしても、スクリプトはマシンをシャットダウンできるようにrootとして実行する必要があります(ルートなしで実行する方法が見つかった場合は悪用可能性があります)。より簡単な方法を求めていますが、システム(「停止」)はスクリプトの最後に追加するだけの行です。

1
system("echo 'rootpassword' | sudo halt") 

しかし、欠点は、スクリプトにプレーンテキストでrootパスワードを持っています。

+1

注:AMIまたはアカウントにパスワードが設定されていない場合は、ルートパスワードが存在しない可能性があります。これは、17トンの暗号鍵を抱えていることの美しさと、秘密鍵、証明書、RSA、x.509などのマスタリングの喜びです。 – Iterator

+0

これは本当に良い点イテレータです。私は自分の分析インスタンスにパスワードを設定しましたが、これは必要ではないかもしれません。念押し有難う。 –

0

sudoはオプションです。パスワードの入力を求めずに特定のコマンドを実行できます。ただ、/etc/sudoers

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

にこのような何かを入れて(もちろんRを実行しているユーザーの名前に置き換え)とsystem('sudo halt')だけで動作するはずです。

+0

@Iteratorありがとうございます。 – mbq

関連する問題