Назад | Перейти на главную страницу

Получение предупреждений при сбое запланированной задачи Windows

Я ищу способ получить предупреждение, если какая-либо из запланированных задач на группе серверов Windows 2003 выйдет из строя (выход с кодом состояния, отличным от 0). Скрипты, коммерческие приложения и плагины для инструментов мониторинга (например, Nagios) - все это открыто для рассмотрения.

ActiveXperts Network Monitor появляется в большинстве результатов поиска, но функция мониторинга запланированных задач является небольшой частью большого коммерческого пакета мониторинга сети.

Ниже приведен сценарий пакетного файла, который выгружает результаты запланированной задачи в CSV-файл, который можно импортировать в SQL Server с помощью SSIS.

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, и отправка электронных писем с предупреждениями, если что-либо было найдено, кажутся громоздкой настройкой. Я бы предпочел использовать существующее решение, чем создавать сложную индивидуальную систему с нуля.

Разберите вывод «schtasks» самостоятельно с помощью ADODB.

Вот небольшая программа 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

Я делаю это в рамках запланированной работы. Все запланированные мной задания - это сценарии. Даже если это графическое приложение, я запускаю его из файла .bat. Все сценарии включают проверку ошибок и используют osql для добавления строки в таблицу «мониторинга заданий». Затем один запрос в таблице сообщает мне, какие задания были выполнены успешно, не удалось или (благодаря левому соединению) не сообщали о каком-либо статусе. Я запускаю этот запрос как запланированное задание на своей рабочей станции, и он отправляет мне отчет по электронной почте.

JR

Вы также можете изучить запуск запланированного сервера задач / сценариев. я использую AdTempus.

Вы также можете создавать множество отчетов и предупреждений. Вы даже можете создавать диаграммы потока работ.

Помогает ли изменение строки в 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. Это простая служба мониторинга запланированных заданий, и звучит так, будто это именно то, что вы ищете.