2016-02-29 171 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