はじめに
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)とか