任何人都可以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.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
中断,那么即使在R进程完成之后,运行wrapper.sh
shell也将继续挂起。 如果你想避免这一点,下面应该工作,
#!/bin/bash setsid Rscript example.R > logfile.txt & tail --pid="$!" -f logfile.txt
哪里"$!"
是执行的最后一个后台进程( Rscript [...]
调用)的进程ID。