我正在寻找一种方法,当 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。这是针对计划作业的简单监控服务,听起来正是您正在寻找的。