2016-02-29 173 views
6

任何人都可以建議我怎麼可能會得到這個工作....從Linux shell腳本調用RSCRIPT

我的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

​​

提前感謝!

+0

不,那不是。如果我這樣做,我會在後臺運行兩個作業,並且CNTL-C不會殺死他們中的任何一個。我希望CNTL-C殺死尾巴-f而不是Rscript。 – David

+0

我沒有訪問'R',但我只是用PHP試過這個確切的腳本,它的工作原理與所描述的一樣。 Ctrl-C殺死父腳本,但是後臺進程仍在運行。 – miken32

回答

3

下,似乎我的Ubuntu機器上工作:發送前

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

tail -f logfile.txt 

下面是一些相關流程SIGINTwrapper.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,你的shell運行wrapper.sh將繼續將R過程完成後還要掛中斷。如果你想避免這種情況,下面應該工作,

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

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

其中"$!"是最後執行的後臺進程的進程ID(在Rscript [...]調用)。

+1

感謝這個答案,這正是我正在尋找。 – David