web-dev-qa-db-ja.com

Windowsのスケジュールされたタスクが失敗したときにアラートを受け取る

Windows 2003サーバーのグループでスケジュールされたタスクのいずれかが失敗した場合(ステータスコードが0ではない状態で終了)にアラートを受け取る方法を探しています。スクリプト、商用アプリケーション、および監視ツール(Nagiosなど)へのプラグインはすべて検討の余地があります。

ActiveXpertsネットワークモニターはほとんどの検索結果に表示されますが、スケジュールされたタスクの監視機能は、大規模な商用ネットワーク監視パッケージのごく一部です。

以下は、スケジュールされたタスクの結果を、SSISを使用してSQLServerにインポートできる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以外のステータスコードを検索するクエリを実行し、何かが見つかった場合にアラートを含む電子メールを送信することは、面倒な設定のように見えることです。複雑なカスタムシステムを最初から作成するよりも、既存のソリューションを使用したいと思います。

4
user10992

私はこれを予定された仕事の一部として行います。私が実行するスケジュールされたジョブはすべてスクリプトです。グラフィカルアプリであっても、.batファイルから起動します。すべてのスクリプトにはエラーチェックが含まれており、osqlを使用して「ジョブ監視」テーブルに行を追加します。次に、テーブルに対する1つのクエリで、成功したジョブ、失敗したジョブ、または(左結合のおかげで)ステータスが報告されなかったジョブがわかります。このクエリを自分のワークステーションでスケジュールされたジョブとして実行すると、レポートがメールで送信されます。

JR

2
John Rennie

ADODBを使用して、「schtasks」の出力を自分で解析します。

これは、「最終結果」がゼロに等しくなく、「ステータス」が「開始できなかった」という事前に作成されたIF/THENブロックを使用して出力を解析する小さなVBScriptプログラムです。必要な数の条件を記述し、コードを代用して、必要に応じて障害条件に対処できます。

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
2
Evan Anderson

Batファイルの行を変更することは役に立ちますか?

失敗したタスクをエコーダンプします。失敗したタスク名とそのステータスコードをダンプします。

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

ここでの1つの問題は、サーバーがホース接続されているためにタスクが実行されない場合、そのサーバーでの監視も失敗することです。

チェックアウト https://cronitor.io 。これはスケジュールされたジョブのシンプルな監視サービスであり、まさにあなたが探しているもののように聞こえます。

0
Encoderer

スケジュールされたタスク/スクリプトサーバーの実行を検討することもできます。 AdTempus を使用します。

大量のレポートやアラートを生成することもできます。 ジョブフロー図を生成することもできます。

0
Joseph Kern