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

我正在寻找一种方法来获取警报,如果一组Windows 2003服务器上的任何计划任务失败(退出状态码不是0)。 监控工具(如Nagios)的脚本,商业应用程序和插件都是开放考虑的。

ActiveXpertsnetworking监视器出现在大多数search结果中,但计划任务监视function是大型商业networking监视包中的一小部分。

下面是一个batch file脚本,它会将计划的任务结果转储到可以使用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的查询,如果发现任何东西发出警报的电子邮件似乎是一个麻烦的设置。 我宁愿使用现有的解决scheme,而不是从头创build一个复杂的自定义系统。

我做这个作为预定工作的一部分。 我运行的所有计划作业都是脚本。 即使它是一个graphics应用程序,我从一个.bat文件启动它。 所有脚本都包含错误检查,并使用osql将行附加到“作业监视”表中。 然后,表中的一个查询告诉我哪些作业成功,失败或(左连接提供)没有报告任何状态。 我运行这个查询作为我自己的工作站上的计划作业,它寄给我一个报告。

JR

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

这里有一个小小的VBScript程序,它将用预先制作的IF / THEN块为“最后结果”不等于零,“状态”为“无法启动”来parsing输出。 您可以根据自己的喜好编写更多的条件,然后用代码replace失败条件。

 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 

您也可以考虑运行计划的任务/脚本服务器。 我使用AdTempus 。

您也可以生成大量的报告和警报。 你甚至可以生成作业stream程图。

更改bat文件中的行是否有帮助?

回波转储不成功的任务,将转储不成功的任务名称及其状态码

 For /F "skip=2 Tokens=1-10 Delims=," %%A in ('schtasks /query /fo csv /v') do if %%G NEQ 0 Echo %%A --} %%G 

这里的一个问题是,如果由于服务器被占用而导致任务不运行,则该服务器上的任何监视也将失败。

看看https://cronitor.io 。 这是一个简单的计划任务监控服务,听起来就像你正在寻找的。