我有一个自动脚本,可以将网站备份提取到本地计算机。这个脚本可能会失败;一旦我的服务器宕机,我就会不小心移动我的脚本。
如何让 Windows 任务计划程序告诉我脚本失败(或未运行/未找到)?
我不在乎是否出现提示、电子邮件或桌面上出现的其他内容。我希望在出现问题时收到通知。在我的服务器上,crontab 会通过电子邮件向我发送错误信息 - 这很棒。我希望在我的 Windows 7 本地计算机上有类似的东西。
答案1
当计划任务启动失败时,事件会被写入任务调度器事件日志:
笔记:任务计划程序日志位于(管理工具下)
Computer Management
System Tools
Event Viewer
Application and Services Logs
Microsoft
Windows
Task Scheduler
Operational
Windows 可让您扳机当各种事件发生时启动的计划任务,例如:
- 一天中的时间
- 系统启动
- 用户登录
- 事件日志中记录的事件
有了这些知识,您可以创建一个在计划任务失败时运行的计划任务:
此计划任务的行动然后可以将其设置为向您发送警报的内容 - 以您选择的方法(例如触发关机)。您可能只希望它发送一封电子邮件:
这就是 Windows 处理一切的方式。您可以看到许多诊断任务在日志中出现事件时触发。例如,当检测到 IP 地址冲突时,会将事件写入日志:
- 日志:系统
- 来源:管道
- 事件 ID:4198
计划任务会触发此事件,并运行程序来通知您并修复它。请记住,事件 ID 并不特定于一个任务。任何生成事件 203(操作启动失败)的任务都将触发此任务。
答案2
这是我的脚本,当我的备份作业的值大于 0 时会提醒我。
$ScheduledTaskName = "Hans\Backup"
$Result = (schtasks /query /FO LIST /V /TN $ScheduledTaskName | findstr "Result")
$Result = $Result.substring(12)
$Code = $Result.trim()
If ($Code -gt 0) {
$User = "[email protected]"
$Pass = ConvertTo-SecureString -String "myPassword" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential $User, $Pass
################################################################################
$From = "Alert Scheduled Task <[email protected]>"
$To = "Me Gmail <[email protected]>"
$Subject = "Scheduled task 'Backup' failed"
$Body = "Error code: $Code"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential $Cred
}
答案3
看一眼PushMon。您可以创建一个 PushMon URL,它将在脚本末尾被调用。如果您的脚本由于服务器关闭或脚本被移动而无法运行,您将收到通知。您可以通过电子邮件、短信、电话、即时通讯和 Twitter 收到通知。这适用于任何操作系统。这类似于 Pingdom,但适用于脚本和后台任务。
答案4
编辑:查看 Ian Boyd 的回答,然后当您开始使用电子邮件操作时,再回到这里。
自从 Ian Boyd 的原始答案发布以来,任务计划程序中的电子邮件操作已被弃用并最终被删除。但创建一个将发送 SMTP 电子邮件的 Powershell 脚本并运行它并不困难。以下是使用 Powershell 和的示例system.net.mail.smtpClient
:
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = "mail.yourdomain.com"
$SmtpClient.Port = 587
#$SmtpClient.EnableSsl = $true
$SmtpClient.Credentials = New-Object System.Net.NetworkCredential( "[email protected]", "{pw}" );
$mailmessage.from = ("[email protected]")
$mailmessage.To.add("[email protected]")
$mailmessage.Subject = “Server Alert”
$mailmessage.Body = “Event 103 or 203 detected. This indicates a Scheduled Task has failed.”
$smtpclient.Send($mailmessage)
根据需要编辑详细信息(例如“mail.yourdomain.com”和凭证“[电子邮件保护]“和”{pw}“。您可能需要对Port
和进行一些调整EnableSsl
。
将此脚本保存为FailedTaskAlert.ps1
一个公共文件夹,例如C:\Users\Public\Documents
。
现在让我们将其连接到一个任务。
在Action
选项卡中使用Start a Program
操作。在 中Program
输入“powershell.exe”,然后在 中Add Arguments
输入您的 ps1 文件,例如“C:\Users\Public\Documents\FailedTaskAlert.ps1”
我看到 Hans Folk 也在这样做,Send-MailMessage
但我认为另一个 cmdlet 变体和有关如何将 Powershell 脚本连接到任务的操作的明确解释会对其他人有所帮助。
警告:请确保在任务计划程序的右侧操作面板中启用了所有任务历史记录,否则您将无法记录事件。如果您看到“历史记录”选项卡带有“已禁用”标签,则表明此功能已关闭。