簡體   English   中英

從linux shell腳本調用Rscript

[英]Calling Rscript from linux shell script

任何人都可以建議我如何讓這個工作....

我有一個R腳本需要幾分鍾才能運行並寫入幾百行輸出。 我想在這個R腳本周圍寫一個shell腳本包裝器,它將在后台啟動R腳本,將其輸出傳遞給一個文件並開始跟隨該文件的底部。 如果用戶然后輸入CTRL-C我想要它殺死shell腳本和tail命令但不是R腳本。 聽起來很簡單吧?

我在下面制作了一個簡化示例,但我不明白為什么這不起作用。 每當我殺死shell腳本時,盡管R腳本顯然在后台運行,但它也會被殺死。 我試過nohup,disown等沒有成功。

example.R

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

wrapper.sh

#!/bin/bash

Rscript example.R > logfile &

tail -f logfile

提前致謝!

以下似乎適用於我的Ubuntu機器:

#!/bin/bash

setsid Rscript example.R > logfile.txt &

tail -f logfile.txt

以下是將SIGINT發送到wrapper.sh之前的一些相關過程:

 5361 pts/10   00:00:00 bash
 6994 ?        00:00:02 update-notifier
 8519 pts/4    00:00:00 wrapper.sh
 8520 ?        00:00:00 R
 8521 pts/4    00:00:00 tail

Ctrl+C ,您可以看到R仍然在運行,但是wrapper.shtail已被殺死:

 5361 pts/10   00:00:00 bash
 6994 ?        00:00:02 update-notifier
 8520 ?        00:00:00 R

雖然使用&附加您的Rscript [...]命令將其發送到后台,但它仍然是同一進程組的一部分 ,因此也接收SIGINT


我不確定這是不是你的意圖,但是因為你正在調用tail -f ,如果沒有用Ctrl+c中斷,運行wrapper.sh shell將在R進程完成后繼續掛起。 如果你想避免這種情況,以下應該可行,

#!/bin/bash

setsid Rscript example.R > logfile.txt &

tail --pid="$!" -f logfile.txt

"$!" 是執行的最后一個后台進程的進程ID( Rscript [...]調用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM