从linux shell脚本调用Rscript

任何人都可以build议我怎么得到这个工作….

我有一个R脚本需要几分钟的时间来运行,并写出几百行的输出。 我想写一个shell脚本包装这个R脚本,它将在后台启动R脚本,将其输出pipe道输出到一个文件,并开始跟随该文件的底部。 如果用户然后inputCTRL-C,我希望杀死shell脚本和tail命令,而不是R脚本。 听起来很简单吧?

我已经在下面制作了一个简化的例子,但我不明白为什么这不起作用。 每当我杀死shell脚本,尽pipeR脚本在后台运行,但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中断,那么即使在R进程完成之后,运行wrapper.sh shell也将继续挂起。 如果你想避免这一点,下面应该工作,

 #!/bin/bash setsid Rscript example.R > logfile.txt & tail --pid="$!" -f logfile.txt 

哪里"$!" 是执行的最后一个后台进程( Rscript [...]调用)的进程ID。