「画面」でemacsを実行し続けるには? emacsでバッファを終了するとプロセスも終了しますか? [閉鎖]

「画面」でemacsを実行し続けるには? emacsでバッファを終了するとプロセスも終了しますか? [閉鎖]

私はいくつかのRコードを実行するためにRセッションを使用しています。

まず、シェルを開き、screen画面セッションを開始するために何かを入力してからemacs -nw

RRで始まり、次のコードを実行するとします。> source("script.R")

このセッションを終了してこのRコードを実行し続けるにはどうすればよいですか?screenバッファを使用して終了するとC-x kセッションも終了しますか?

答え1

emacsが閉じると、Rプロセスは終了します。引き続き実行するには、emacsを閉じずにscreenセッションを切断してください。私はこれが C-a dデフォルトだと思います。

あなたの例では、まずscreen端末で開きます。

screen

その後、emacsを起動し、-nw次のようにテキストモードで実行します。

emacs -nw

ESSがインストールされている場合は、を介してM-x RRを起動します。シェルで実行している場合(なぜ?ESSを使用してください!)の代わりにこれを実行してください。

今分析を始めましょう。たとえば、

for(i in 1:100){
  Sys.sleep(5)
  print(i)
}

今度は別のセッションを使用してくださいC-a d。端末を閉じたり、コンピュータからログアウトしたりすることもできます。しかし、閉じないでください!タスクがどのように進行しているかを確認するには、-r次のフラグを使用して別の端末を開き、画面を呼び出します。

screen -r

Emacs内でRセッションがまだ実行されていることがわかります。

> Sys.sleep(4)
> for(i in 1:100){
+ Sys.sleep(5)
+ print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8

EmacsとRを実行し続け、画面を外し(閉じない)、コンピュータをシャットダウンしないでください。それがすべてです。

答え2

Screenはターミナルマルチプレクサで、サーバー/クライアントモデルを持っています。画面を起動すると、サーバーを起動するためにバックグラウンドで独自にフォークされ、フォアグラウンドクライアントはサーバーとの通信を開始します。これの目的は、クライアントに何が起こってもバックグラウンドで実行を続けることです(クライアントが終了してもsshなどを介して実行している場合は接続が切断されます)。

サーバーからスクリーンクライアントを分離するには、crtl+を押してaからを押しますd。その後、を使用してscreen -ls実行中のすべての画面セッションを一覧表示し、screen -r最後の画面セッションに追加できます。

ただし、画面内のemacs内でRを実行している場合、emacsはRプログラムを閉じるタイミングを決定し、画面はこれについて何も言いません。

Screenでは、ウィンドウを分割して複数のウィンドウを持つこともできます。 emacsを使用する代わりにアプリケーションを起動しても、emacsを終了しても実行を続行できます。

答え3

それが唯一の窓なら、それを殺すそれWindowsも殺すことができますscreen。ウィンドウが開いている限り、実行を続けるscreen必要があります。たとえば、次を実行しているとします。R別のウィンドウで。

screenただし、通常、ウィンドウを終了すると信号が送信されるため、ウィンドウ内の内容も停止します。

現在のウィンドウを終了します。もしあれば実装するコマンドが実行され、終了します。それ以外の場合、ウィンドウで実行されているプロセス(シェル)はHANGUPこの場合、ウィンドウ構造が削除され、画面(モニター)が別のウィンドウに切り替わります。最後のウィンドウが破壊されると、画面は終了します。画面終了後、以前に表示されたウィンドウに切り替えます。注:Emacsユーザーは行を削除するときにこのコマンドを覚えておく必要があります。使用しないことをお勧めします"C-a"画面エスケープキーまたはキルリバインド"C-a K"

走っているならREmacsバッファに入れてから(バックグラウンドに入れるために何もせずに/または使用せず)nohup)Emacsウィンドウを閉じるには、次のものが必要です。Rそれで。

もちろん、screenセッションから切り離すこともできます。 (これは次のとおりです。殺す窓): control+Ad

でも読むと役に立つマニュアルページ

答え4

Emacsでシェルを実行していますか?その場合は、Unixジョブ制御を使用してRスクリプトをバックグラウンドに配置できます。Rスクリプトが実行されたら、と入力してCtrl-C Ctrl-Zシェルプロンプトに戻ります。これによりスクリプトが一時停止します。その後、bgバックグラウンドで一時停止したジョブを再開するように入力します。シェルコマンドを使用して、ジョブがバックグラウンドで実行されていることを確認できますjobs

あなたが望むことを達成するもう一つの方法は、Rバックグラウンドでスクリプトを最初から始めることです。バラよりこのリンクこれRをするこのリンクこれはコマンドラインから直接実行してください。

関連情報