【保存版】サービス状態を監視して異常時に自動再起動するPowerShellスクリプト

Windows

「重要なWindowsサービスが止まっていて業務が止まった…」
「サーバーの監視をもっと自動化したい」

そんな悩みに応えるのが、PowerShellでサービスの状態を定期監視し、異常時に自動再起動するスクリプトです。

この記事では、実用的なPowerShellスクリプトのサンプルと、応用的な使い方(ログ出力・メール通知・タスクスケジューラ連携)まで、初心者にもわかりやすく解説します。

スポンサーリンク

スクリプトの概要とできること

このスクリプトは以下の機能を実現します:

  • 指定したサービスを監視
  • 「停止中」または「異常」状態であれば自動で再起動
  • 必要に応じてログに記録
  • タスクスケジューラと組み合わせて定期実行も可能

基本スクリプトのサンプルコード

以下は、「Spooler」サービス(印刷スプーラー)を監視し、異常があれば再起動するスクリプトです。

# サービス名を指定
$ServiceName = "Spooler"

# サービス状態を取得
$service = Get-Service -Name $ServiceName

# 状態をチェックして、停止していれば再起動
if ($service.Status -ne "Running") {
    Restart-Service -Name $ServiceName -Force
    Write-Output "$(Get-Date) [$ServiceName] を再起動しました。" 
} else {
    Write-Output "$(Get-Date) [$ServiceName] は正常に稼働中です。" 
}

ログファイルへの記録を追加する方法

スクリプトをログ付きにすることでトラブルの履歴を追えるようになります。

$LogPath = "C:\Logs\ServiceMonitor.log"
$ServiceName = "Spooler"
$service = Get-Service -Name $ServiceName

if ($service.Status -ne "Running") {
    Restart-Service -Name $ServiceName -Force
    "$((Get-Date)) [$ServiceName] を再起動しました。" | Out-File $LogPath -Append
} else {
    "$((Get-Date)) [$ServiceName] は稼働中です。" | Out-File $LogPath -Append
}

事前にログ保存用のフォルダ(例:C:\Logs)を作成しておきましょう。

タスクスケジューラと連携する方法

このスクリプトを自動で定期実行するには、Windowsのタスクスケジューラを使います。

手順:

  1. 「タスクスケジューラ」を開く
  2. 「基本タスクの作成」→ 名前を入力
  3. 実行トリガーを「◯分ごと」「ログオン時」などに設定
  4. 「操作」→「プログラムの開始」→ powershell.exe
  5. 引数に以下を指定:
-ExecutionPolicy Bypass -File "C:\Path\To\YourScript.ps1"
  1. 完了!

応用:メール通知やSlack通知も可能

PowerShellはSend-MailMessageを使えばメール通知も簡単です(ただしSMTP設定が必要)。

Send-MailMessage `
  -To "admin@example.com" `
  -From "monitor@example.com" `
  -Subject "サービス異常通知" `
  -Body "$ServiceName が再起動されました" `
  -SmtpServer "smtp.example.com"

SlackやTeamsのWebhookに送信することも可能です(JSONでPOST)。

# Slack通知の例
$SlackWebhookUrl = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"
$ServiceName = "Spooler"

if ($service.Status -ne "Running") {
    Restart-Service -Name $ServiceName -Force
    
    # Slackへ通知するJSONデータを作成
    $payload = @{
        text = "$ServiceName サービスが停止していたため、再起動しました。"
    } | ConvertTo-Json
    
    # Webhookに送信
    Invoke-RestMethod -Uri $SlackWebhookUrl -Method Post -Body $payload -ContentType 'application/json'
}

注意点と安全な運用のコツ

注意点解説
管理者権限で実行するサービスの再起動には管理者権限が必要です
自動再起動し続けないようにする状況によっては異常の根本解決を優先すべき
ログファイルの肥大化に注意定期的なローテーションまたはサイズ制限を設定しましょう

ログローテーションの実装例:

# ログファイルのサイズチェックと管理
$LogPath = "C:\Logs\ServiceMonitor.log"
$MaxLogSize = 5MB  # 最大ファイルサイズ

if ((Test-Path $LogPath) -and ((Get-Item $LogPath).Length -gt $MaxLogSize)) {
    # バックアップ作成
    $BackupLog = $LogPath -replace '\.log$', "_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
    Move-Item $LogPath $BackupLog
}

まとめ:自動監視+自動復旧で安心の運用へ

Windowsサービスの停止や異常を放置すると、業務やシステムの大きなトラブルにつながる可能性があります。

PowerShellによるサービス監視スクリプトを導入すれば、人の手を介さずに即時復旧が可能になります。

ポイント:

  • Get-Service + Restart-Service で自動監視が実現可能
  • ログ記録やタスクスケジューラと連携するとさらに便利
  • 応用すれば通知・複数サービス対応も可能!

より高度な実装を目指す場合は、「再起動回数のカウントと上限設定」「異常パターンに応じた対応」「システム管理者への詳細レポート」なども検討してみると良いでしょう。

システム運用の自動化で、業務効率と安定性を高めていきましょう!

コメント

タイトルとURLをコピーしました