Отправка электронной почты из R - при сбое запланированного сценария в Windows
У меня есть Rscript-файл (Main_Script.R), который запускается как запланированное задание в планировщике задач Windows каждые 30 минут. Main_Script.R
- У меня есть около 13 сценариев, которые запускаются каждые 30 минут.
Я хотел отправить письмо от R - всякий раз, когда итерация не удалась или взломали. Я использую пакет sendMailR - и я видел сообщение в SO how to send email with attachment from R in windows
о том, как отправить emqil из R Windows.
Но я не уверен насчет - как отправить email automatically with the error message
- когда запланированная итерация задачи не пройдена или не исправлена.
мой Main_Script.R
- имеет source
всего 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
Обновить:
Когда сценарий сталкивается с ошибкой - он должен вызвать электронную почту - с указанием erorr и именем или номером сценария, чтобы указать, какой из 13 сценариев завершился неудачно, и отправить на почтовый идентификатор.
1 ответ
Вот решение, которое оборачивает ваш скрипт источников:
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
функционировать отдельно, пока не работает.