Windowsサーバーのサービスを自動監視・起動する方法とタスクスケジューラ活用術

## はじめに

本記事では、Windowsサービスの監視および自動起動を行うバッチファイルの作成方法を紹介します。

重要なサービス（例: ADやDNS）が停止すると、システム全体に影響を与えるため、自動で状態を監視し、停止時に起動する仕組みが必要です。

実務ではDatadogなどの監視ツールを使うことが多いですが、今回は手軽にバッチファイルで監視する方法を説明します。

## 前提条件

この記事の内容を実行するためには、以下の環境が必要です。

:::note info
**検証環境**
**AD兼DNSサーバー:**
Windows Server（ここでは Windows Server 2022）で構築され、ドメインが構成済みであること。
:::

また、管理者権限を持つユーザーアカウント、および基本的なバッチファイルの知識があることを前提としています。

**自宅のVirtualBox環境**
今回も VirtualBox 上で構築した検証環境を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3d9d22ff-457a-1b00-58af-ff9948466145.png)

:::note info
※検証には「Windows Server 2022」を使用します。
:::

## 知識整理

Windowsサービスの監視と自動起動を行うために、必要な知識を簡単に整理します。

:::note warn
**sc query コマンド** 
サービスの状態を確認するために使用します。これにより、サービスが「実行中」か「停止」かを判定します。

**タスクスケジューラ**
Windowsに標準で搭載されているツールで、指定した時間やイベントに基づいてプログラムやスクリプトを自動的に実行できます。

**バッチファイル**
複数のコマンドを自動で実行するために使用されるWindowsのファイル形式です。

**ログファイルの管理**
いつサービスが停止し、起動したかを記録するためのファイルです。
:::

## バッチファイルの処理フローとディレクトリ構成

ここでは、Windowsサービスを監視し、サービスが停止していた場合に自動的に起動するバッチファイルの処理フローと、ファイルの配置構成について説明します。

シンプルな処理ながら、効果的にサービスの状態を監視し、障害が発生した際には迅速に対応することができます。

### 処理フロー
以下は、バッチファイルの処理フローです。サービスの状態を確認し、停止している場合は起動し、その結果をログに記録する仕組みです。

```
+------------------------------+
|      バッチファイル開始     |
+------------------------------+
  |
  v
+------------------------------+
| サービスの状態をチェック     |
+------------------------------+
  |
  v
+------------------------------+
| サービステータスに "RUNNING" |
| が含まれているか確認        |
+------------------------------+
  |           |
  |           v
  |   +------------------------------+
  |   | サービスが停止している       |
  |   +------------------------------+
  |           |
  |           v
  |   +------------------------------+
  |   | サービスを開始                |
  |   +------------------------------+
  |           |
  |           v
  |   +------------------------------+
  |   | 5秒待機 (timeout)            |
  |   +------------------------------+
  |           |
  |           v
  |   +------------------------------+
  |   | 正常に開始したことをログに      |
  |   | 書き込む                      |
  |   +------------------------------+
  |           |
  |           v
  |     +------------------------------+
  |     |           処理終了          |
  |     +------------------------------+
  |
  v
+------------------------------+
| サービスは正常に実行中です     |
+------------------------------+
  |
  v
+------------------------------+
| ログファイルにメッセージを書き込み |
+------------------------------+
  |
  v
+------------------------------+
|           処理終了          |
+------------------------------+

```


### ディレクトリ構成

以下は、バッチファイルとログファイルの配置例です。作成するバッチファイルは任意の場所に配置できますが、わかりやすく整理することをおすすめします。

```
C:\Users\Administrator\Desktop\サービスの監視検証\
│
├─ service_monitor.bat        (監視と開始のバッチファイル)
└─ service_monitor.log        (監視結果を記録するログファイル)
```

:::note warn
シンプルな構成で作成することで、管理しやすくなり、問題が発生した場合でもログをすぐに確認できます。
:::

## 検証の流れ

Windowsサービスの監視と自動起動を行う手順を以下の2ステップで説明します。

**ステップ1: サービスの状態を監視して自動起動**
**ステップ2: 定期的な監視の設定 (タスクスケジューラの利用)**

:::note info

前提として、検証環境がすでに構築されていることを前提としています。
:::

### ステップ1: サービスの状態を監視して自動起動

まずは、サービスの監視と自動起動を行うバッチファイルを作成します。

ここではActive Directory Domain Services（NTDSサービス）を例にしていますが、任意のサービス名に置き換えて使用可能です。

:::note warn
補足として、Windowsサービスを監視する際には、表示名(Active Directory Domain Services)ではなく、サービス名(NTDS)を指定する必要があります。
:::

```service_monitor.bat
@echo off
set SERVICE_NAME=NTDS
set LOG_FILE=C:\Users\Administrator\Desktop\サービスの監視検証\service_monitor.log

REM サービスの状態をチェック
sc query %SERVICE_NAME% | findstr /C:"RUNNING" >nul
if %errorlevel% neq 0 (
    echo %date% %time%: %SERVICE_NAME% が停止しているため起動します。 >> %LOG_FILE%
    sc start %SERVICE_NAME%
    timeout /t 5
    
    REM サービスの状態に関係なく正常に起動したと記録
    echo %date% %time%: %SERVICE_NAME% が正常に起動しました。 >> %LOG_FILE%
) else (
    echo %date% %time%: %SERVICE_NAME% は正常に実行中です。 >> %LOG_FILE%
)
```

このスクリプトでは、**sc query コマンド**でサービスの状態を確認し、停止していた場合に起動します。

ここでは、C:\Users\Administrator\Desktop\サービスの監視検証\service_monitor.log に結果が記録されます。

:::note alert
※注意: ファイルの文字エンコーディングがUTF-8などに設定されていると、バッチファイル実行時に文字化けなどが発生することがありますので、**ファイルを「Shift-JIS」で保存してください**。
:::


**Active Directory Domain Services(NTDSサービス)が既に実行中の場合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/49d5d4c3-ebfc-1c69-f752-dfc4ab66b5b1.png)


```
2024/09/19 20:29:16.12: NTDS は正常に実行中です。 
```

サービスが正常に実行中であることを確認し、ログに出力されました。

**Active Directory Domain Services(NTDSサービス)が停止中の場合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9c9f3862-781f-1117-28e2-e273519d1d69.png)

サービスが停止していることを確認し、自動で起動されました。

```
2024/09/19 21:13:30.64: NTDS が停止しているため起動します。 
2024/09/19 21:13:30.64: NTDS が正常に起動しました。 
```

ログにも停止状態と起動状態が記録されていることが確認できました。

### ステップ2: 定期的な監視の設定 (タスクスケジューラの利用)

このバッチファイルを定期的に実行するために、タスクスケジューラを使用します。手順は以下の通りです。

```
タスクスケジューラを開く
「スタート」→「Windows管理ツール」→「タスクスケジューラ」を選択します。

タスクの作成
「タスクの作成」を選び、名前を「サービス監視」に設定します。

トリガーの設定
「トリガー」タブで「新規」をクリックし、5分ごとにバッチファイルを実行するようにスケジュールを設定します。

アクションの設定
「アクション」タブで「新規」を選び、service_monitor.bat を実行するように設定します。
```

タスクスケジューラを使うことで、例えば5分ごとにサービスの状態を自動で監視することが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/91ada6a0-6ec2-b60b-1896-8b884da863b7.png)

これで、指定した間隔で自動的にサービスを監視し、停止している場合は自動で起動するようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/15c35e63-e8fc-4290-2626-a43334f0386b.png)


## まとめ

sc query コマンドを使ったサービスの状態監視と、起動バッチファイルの作成を組み合わせることで、日常的な監視作業を自動化し、システムの安定性を向上させることができました。


今後は、SMTPリレーサーバーを構築してメール通知を行う検証を進める予定です。

## 参考記事
https://qiita.com/miisuke/items/83e197e6f81f01e5a97f

https://ameblo.jp/shinnaka54/entry-12662177325.html

https://note.com/nerone1024/n/n6712046ff57e