在Windows中,当定时脚本失败时如何从R发送电子邮件

4

我有一个R脚本文件(Main_Script.R),每30分钟在Windows任务计划程序中作为定时任务运行。在Main_Script.R内,我有大约13个脚本,每30分钟运行一次。

我想要从R中发送电子邮件-每当迭代失败或停止时都会发送。我正在使用sendMailR包,并且我在SO上看到了一篇文章如何在Windows中使用R发送带附件的电子邮件-关于如何从R Windows发送电子邮件。

但是我不确定如何在计划任务迭代失败或停止时自动发送带有错误消息的电子邮件

我的Main_Script.R -具有所有13个代码的

source(paste(rootAddress,"Scripts/Part1.R",sep =''))
source(paste(rootAddress,"Scripts/Part2.R",sep =''))
:
:
:
:
source(paste(rootAddress,"Scripts/Part13.R",sep =''))

我的计划任务如下所示,带有日志文件

"D:\xxx\R-3.0.2\bin\x64\Rscript.exe" "D:\xx\Batch_Processing\Batch_Processing_Run\Scripts\Main_Test.R" >> "D:\XXX\Batch_Processing\Batch_Processing_Run\error.txt" 2>&1

更新:

当脚本遇到错误时,它应该触发一封包含错误消息和脚本名称或编号的电子邮件,以表示13个脚本中的哪一个失败,并发送到指定的邮件地址。


1
将您的语句用 tryCatch 包裹起来,等待评估完毕后,捕获任何错误并发送电子邮件。 - Roman Luštrik
我有大约13个脚本 - 对它们进行trycatch处理会很麻烦,是否有其他方法可以获取错误并将其附加在邮件中。在互联网上看到了(options(error=(...))的建议,但不确定如何操作。 - Prasanna Nandakumar
你只需要一个tryCatch来包含所有的source调用。 - Spacedman
那么现在是两个问题吗?你知道如何从R发送任何电子邮件吗? - Spacedman
1
我的问题是 - 我不知道如何在批处理作业失败时发送电子邮件。为了发送任何电子邮件 - 在SO中有一些示例 - 我可以参考并让它们工作,这就是我的意思。 - Prasanna Nandakumar
显示剩余2条评论
1个回答

8
这是一个将你的源代码包装起来的解决方案:
tryCatch({
source("fail1.R")
source("fail2.R")
source("fail3.R")
},
         error=function(e){cat("send email with error ",e$message,"\n")})

我的脚本如下:

if(x==1){stop("Fail One!")}

类似的技术。因此:
> x=22
> source("doall.R")
> x=2
> source("doall.R")
send email with error  Fail Two! 

那么,将我的cat替换为您的电子邮件发送即可完成工作。错误作为参数传递给处理程序,因此您可以从中获取消息。

以下是如何使用与您的示例编号相同的13个脚本并确定哪个出错:

for(i in 1:13){
 try( {
      source(paste(rootAddress,"Scripts/Part",i,".R",sep =''))
      },
      error = function(e){mailMe(i, e$message)}
    )
}

现在您只需要编写mailMe函数,该函数获取脚本编号和错误消息。它可能类似于这样:
mailMe = function(i, message){
  subject=paste("Error in script ",i)
  body = paste("Error was ",message," in script ",i)
  someSendmailRfunction(to="me@my.come", subject=subject,body=body, etc=etc)
}

请注意,您可以单独测试 mailMe 函数,直到其正常工作。

好的,我正在尝试您的方法 - 但是我在“发送电子邮件”时遇到了错误函数的问题。我已经更新了问题 - 我还需要知道这13个脚本中哪一个失败了。 - Prasanna Nandakumar
@PrasannaNandakumar 首先学习如何从 tryCatch 中捕获 1001 位。其余的应该无缝地落入其位置。我会问另一个问题,即如何使用 tryCatch 告诉哪个脚本产生了错误。提供一个可重现的示例,展示一些努力,答案是有保证的。 - Roman Luštrik
@RomanLuštrik 我正在遵循上面的答案尝试使用错误函数发送电子邮件。然而,我以前没有使用过sendmailR包,所以我正在尽力创建邮件功能 - 在错误模块中(使用sendmailR包)发送邮件。 - Prasanna Nandakumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接