Windowsのタスクスケジューラを使っていると、「あれ、いつの間にかタスクが止まってる…」という経験、ありませんか?特に、長時間かかる処理や無限ループに陥りやすいスクリプトを実行していると、タイムアウトでタスクが自動的に停止することがあります。そんなとき、タイムアウトを検知してすぐにメールで通知してくれたら、安心ですよね。
今回は、初心者の方にもわかりやすく、Windowsタスクスケジューラでタイムアウトを検知し、メール通知する方法をご紹介します。これを知っておけば、万が一のトラブルにも迅速に対応できますよ。
目次
- タイムアウトとは?
- タイムアウトを検知する方法
- メール通知を設定する方法
- よくある質問
- まとめ
タイムアウトとは?
まず、タイムアウトとは、タスクが設定した時間内に終了しなかった場合に、自動的に停止される仕組みです。例えば、1分以内に処理が終わらないと判断されると、タスクスケジューラがそのタスクを強制終了します。
これにより、無限ループや長時間かかる処理が原因で、他のタスクに影響を与えるのを防ぐことができます。
タイムアウトを検知する方法
タイムアウトが発生すると、Windowsのイベントログに記録されます。これを利用して、タイムアウトを検知することができます。
以下の手順で、タイムアウトイベントを確認できます。
- 「イベントビューア」を開きます。
- 左側の「Windowsログ」から「アプリケーション」を選択します。
- 右側の「操作」から「フィルタの作成」をクリックします。
- 「イベントID」に「329」と入力し、「OK」をクリックします。
これで、タイムアウトが発生したイベントのみが表示されます。
メール通知を設定する方法
タイムアウトを検知したら、次はメールで通知を受け取りましょう。以下の手順で、PowerShellスクリプトを使ってメール通知を設定できます。
- 以下の内容で「send-timeout-mail.ps1」という名前のPowerShellスクリプトを作成します。
$From = "送信元メールアドレス"
$To = "送信先メールアドレス"
$Subject = "タイムアウト通知"
$Body = "指定したタスクがタイムアウトしました。"
$SMTPServer = "SMTPサーバー名"
$SMTPClient = New-Object Net.Mail.SmtpClient($SMTPServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("SMTPサーバーのユーザー名", "SMTPサーバーのパスワード")
$Mail = New-Object Net.Mail.MailMessage($From, $To, $Subject, $Body)
$SMTPClient.Send($Mail)
- 次に、タスクスケジューラでタイムアウトイベントを検知した際に、このスクリプトを実行するように設定します。
タスクスケジューラを開き、「新しいタスクの作成」を選択します。
「トリガー」タブで、「新規」をクリックし、「イベントの発生時」を選択します。
「ログ」に「Microsoft-Windows-TaskScheduler/Operational」、「ソース」に「Microsoft-Windows-TaskScheduler」、「イベントID」に「329」を入力します。
「操作」タブで、「新規」をクリックし、「プログラム/スクリプト」に「powershell.exe」、「引数の追加」に「-File C:\path\to\send-timeout-mail.ps1」を入力します。
これで、指定したタスクがタイムアウトすると、自動的にメールで通知が届くようになります。
よくある質問
Q1: PowerShellスクリプトの実行がブロックされる場合、どうすれば良いですか?
PowerShellの実行ポリシーが制限されている可能性があります。以下のコマンドで実行ポリシーを変更できます。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Q2: メールが届かない場合、どこを確認すれば良いですか?
SMTPサーバーの設定や、送信元・送信先のメールアドレスが正しいか確認してください。また、メールサーバーがブロックしていないかも確認しましょう。
まとめ
以上、Windowsタスクスケジューラでタイムアウトを検知し、メール通知する方法をご紹介しました。これを設定しておけば、万が一のトラブルにも迅速に対応できます。



コメント