当 Windows 计划任务失败时收到警报

当 Windows 计划任务失败时收到警报

我正在寻找一种方法,当 Windows 2003 服务器上的任何计划任务失败时(退出时状态代码不为 0),可以收到警报。脚本、商业应用程序和监控工具插件(如 Nagios)都可以考虑。

ActiveXperts 网络监视器出现在大多数搜索结果中,但计划任务监控功能只是大型商业网络监控软件包的一小部分。

下面是一个批处理文件脚本,它将把计划任务的结果转储到可以使用 SSIS 导入 SQL Server 的 csv 文件中。

rem MC: dump the scheduled task results into the specified outfile
@echo off

set outfile=c:\temp\scheduled_tasks.csv

rem MC: the for loop skips over the first blank that schtasks adds to the output
for /f "TOKENS=*" %%A in ('schtasks /query /fo csv /v') do ( echo %%A >> %outfile% )

这种方法的缺点是,将 csv 文件导入数据库表、运行查询以查找非 0 的状态代码,以及在发现任何内容时发送带有警报的电子邮件,这似乎是一个繁琐的设置。我宁愿使用现有的解决方案,也不愿从头开始创建复杂的自定义系统。

答案1

我将此作为计划作业的一部分来执行。我运行的所有计划作业都是脚本。即使它是一个图形应用程序,我也从 .bat 文件启动它。所有脚本都包含错误检查,它们使用 osql 将一行附加到“作业监控”表中。然后表上的一个查询告诉我哪些作业成功、失败或(由于左连接)没有报告任何状态。我在自己的工作站上将此查询作为计划作业运行,它会向我发送报告。

JR

答案2

使用 ADODB 自己解析“schtasks”的输出。

这是一个小型 VBScript 程序,它将使用预制的 IF/THEN 块解析输出,其中“最后结果”不等于零,并且“状态”为“无法启动”。您可以根据需要写入任意数量的条件,并替换代码以根据故障条件采取任何行动。

Option Explicit

' ADO Constants
Const adCmdText = 1
Const adLockOptimistic = 3
Const adOpenStatic = 3

' Path to text file and filename
Const FILEPATH = "C:\WINDOWS\TEMP"  ' Don't append "\"
Const FILENAME = "tasks.csv"

Dim x, objShell, objConn, objRS, dictFields, Field

' Write output of schtasks to file
Set objShell = CreateObject("WScript.Shell")
objShell.Run "%COMSPEC% /c schtasks /query /fo csv /v > """ & FILEPATH & "\" & FILENAME & """", 1, True

' Connect recordset to CSV file
Set objConn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")

objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FILEPATH & ";Extended Properties=""text;HDR=YES;FMT=CSVDelimited"""
objRS.Open "SELECT * FROM " & FILENAME, objConn, adOpenStatic, adLockOptimistic, adCmdText

' Load header into dictionary - Prefer to do this in case format changes in future version of Windows
Set dictFields = CreateObject("Scripting.Dictionary")

x = 0
For Each Field in objRS.Fields
    dictFields.Add Ltrim(Rtrim(Field)), x
    x = x + 1
Next ' Field
objRS.MoveNext

Do Until objRS.EOF

    ' Check last status for something other than 0
    If objRS.Fields.Item(dictFields("Last Result")) <> 0 Then 
        WScript.Echo "Scheduled Task " & objRS.Fields.Item(dictFields("TaskName")) & " returned status of " & objRS.Fields.Item(dictFields("Last Result"))
    End If

    ' Check "Status" for "Could Not Start"
    If NOT IsNull(objRS.Fields.Item(dictFields("Status"))) Then
        If UCase(objRS.Fields.Item(dictFields("Status"))) = "COULD NOT START" Then  
            WScript.Echo "Scheduled Task " & objRS.Fields.Item(dictFields("TaskName")) & " could not start"
        End If
    End If

    objRS.MoveNext
Loop

答案3

您还可以考虑运行计划任务/脚本服务器。我使用陸軟

您还可以生成大量报告和警报。您甚至可以生成工作流程图。

答案4

这里的一个问题是,如果由于服务器受到攻击而导致任务无法运行,则该服务器上的任何监控也将失败。

查看https://cronitor.io。这是针对计划作业的简单监控服务,听起来正是您正在寻找的。

相关内容