[英]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.sh
和tail
已被殺死:
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.