R脚本被杀死时清理

时间:2014-08-12 06:57:19

标签: r code-cleanup

我有一个R脚本,我必须'杀死'有时停止执行。但是在“杀死”它时,执行清理的代码(关闭连接等)不会被执行。 无论脚本如何停止,如何确保执行清理代码。

我的脚本是myTest.R:

print("script called")

Sys.sleep(20)

.Last<-function()
{
 print("Last called")
}

我从命令行启动R脚本:

> Rscript myTest.R

如果我等待20秒,则调用.Last函数。

现在有时我必须通过调用来中断脚本的执行:

kill -USR1 pid

其中pid是进程ID。此调用记录在此处: http://stat.ethz.ch/R-manual/R-devel/library/base/html/Signals.html

这会终止进程,但不会调用.Last函数。但文档说它应该被调用。我在这里想念的是什么请帮忙。哦,我在Linux上运行它。

由于

2 个答案:

答案 0 :(得分:0)

您将在?conditions中找到错误处理的所有可能性。 一种可能是使用tryCatch允许您使用已定义的表达式或值失败:

library(parallel)          
cl <- makeCluster(2)
test <- function(x) {
  2+x
  e <- simpleError("test error")
  stop(e)
}
# I do not stop the connection to the cluster in  test()
tryCatch(test(2), finally = stopCluster(cl))
#but after failing a call to 
stopCluster(cl) #gives,
Error in summary.connection(connection) : invalid connection
# because with tryCatch it fails with closing the connections

然而还有其他可能性,例如withRestartwithCallingHandlers ...

答案 1 :(得分:-1)

在我们将中断发送给R之前,需要先定义.Last函数。所以它应该是:

print("script called")

.Last<-function()
{
 print("Last called")
} 

Sys.sleep(20)

现在工作正常。