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以外のステータスコードを検索するクエリを実行し、何かが見つかった場合にアラートを含む電子メールを送信することは、面倒な設定のように見えることです。複雑なカスタムシステムを最初から作成するよりも、既存のソリューションを使用したいと思います。
私はこれを予定された仕事の一部として行います。私が実行するスケジュールされたジョブはすべてスクリプトです。グラフィカルアプリであっても、.batファイルから起動します。すべてのスクリプトにはエラーチェックが含まれており、osqlを使用して「ジョブ監視」テーブルに行を追加します。次に、テーブルに対する1つのクエリで、成功したジョブ、失敗したジョブ、または(左結合のおかげで)ステータスが報告されなかったジョブがわかります。このクエリを自分のワークステーションでスケジュールされたジョブとして実行すると、レポートがメールで送信されます。
JR
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
Batファイルの行を変更することは役に立ちますか?
失敗したタスクをエコーダンプします。失敗したタスク名とそのステータスコードをダンプします。
For /F "skip=2 Tokens=1-10 Delims=," %%A in ('schtasks /query /fo csv /v') do if %%G NEQ 0 Echo %%A --} %%G
ここでの1つの問題は、サーバーがホース接続されているためにタスクが実行されない場合、そのサーバーでの監視も失敗することです。
チェックアウト https://cronitor.io 。これはスケジュールされたジョブのシンプルな監視サービスであり、まさにあなたが探しているもののように聞こえます。
スケジュールされたタスク/スクリプトサーバーの実行を検討することもできます。 AdTempus を使用します。
大量のレポートやアラートを生成することもできます。 ジョブフロー図を生成することもできます。