京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Rscriptをバックグラウンド実行するときに知っておくべきこと

はじめに

Macターミナルから Rコマンドを実行する最も便利な方法は、 Rscriptコマンドを使用することである。

Rscriptコマンドは、#!スクリプト*1や、 その他のスクリプトアプリケーションで使用するための代替フロントエンドである。

つまりは、Macのターミナル上からでも、Rコードを実行できるコマンドである。

今回、少し変則的に、Rscriptのバックグラウンド実行のやり方を紹介する。

Rコードのバックグラウンド実行

以下のようなRスクリプトが書かれた、 test.R ファイルがあったとする。

中身は、ベクトルaの計算を3秒スリープしながら、 実行して結果をprintとかで出力するコードである。

a <- c(1, 2, 3, 4, 5)

Sys.sleep(3)
print(mean(a))

Sys.sleep(3)
print(sd(a))

Sys.sleep(3)
message(paste0(mean(a), "±", round(sd(a), 3)))

さっそく、ターミナルを起動して、 これをRscriptコマンドで実行してみる。

#ターミナル起動・ディレクトリ移動

#実行
Rscript test.R

#[1] 3
#[1] 1.581139
#3±1.581

10秒くらい経つと、3行の結果が出力される。

次に、この実行コマンドをバックグラウンド実行する場合には、nohup&を使用する。

nohupは先頭につけて、&は実行コマンドの最後につける。

#バックグラウンド実行
nohup Rscript test.R &

#[1] 39058
#appending output to nohup.out

そして、nohup&を付けると、結果が出力されなくなる。

デフォルトだと、nohup.outに実行ログが出力される。

catコマンドでログを見てみると、確かに出力されている。

cat nohup.out

#[1] 3
#[1] 1.581139
#3±1.581
#[1]+  Done                    nohup Rscript test.R

実際、nohup&の組み合わせは、 Rscriptコマンドに限らず、使用できる。 他の実行コマンドでも試して欲しい。

最後に

よくあるトラブルとして、 sshでリモート接続しているときに、 sshログアウト時に送られるHUPシグナルによって、 実行中のコマンドが停止されることがある。 それを防ぐ場合にも、nohupコマンドを使うと良い。

*1:シェル(sh)とか