Windows Serverでの定期的な再起動をバッチファイルとタスクスケジューラで実現する方法

## はじめに
サーバーの安定稼働を維持するためには、定期的な再起動が必要な場合があります。

これを自動化し、再起動の成否を記録する方法として、バッチファイルとタスクスケジューラを組み合わせたシンプルな検証環境を構築します。

本記事では、毎日朝の8時にサーバーを再起動するタスクを設定し、再起動の成功・失敗をログに記録する手順を紹介します。

## 前提条件
今回の検証を進めるにあたり、以下の環境が必要です。

:::note info 
**検証環境**
**Windows Server 2016 以降の環境:** 
Windows Server（ここでは Windows Server 2022）で構築している状態です。 
:::

その他には、Windows Serverに管理者権限があり、基本的なバッチファイルの知識やタスクスケジューラにアクセスできることを想定しています。

**自宅の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に標準で搭載されている機能で、指定した時間やイベントに基づいてプログラムやスクリプトを自動的に実行することができます。

**バッチファイル（reboot.bat）とは？**
バッチファイルは、Windowsで複数のコマンドを自動で実行するためのファイル形式です。reboot.batでは、指定された条件下でサーバーを再起動し、その結果をログに記録します。

:::note warn
さらに詳しく知りたい場合は、以下のリンクも参考にしてください。
**タスクスケジューラについて**
公式サイト：https://learn.microsoft.com/ja-jp/windows/win32/taskschd/about-the-task-scheduler
参考サイト：https://wa3.i-3-i.info/word11751.html

**バッチファイルについて**
参考サイト：https://it-trend.jp/development_tools/article/32-0040
参考サイト：https://qiita.com/talesleaves/items/8990a55b7a770de3d34f
:::

## 構築の流れ
ここでは、3つのステップに分けて設定を進めていきます。

**ステップ1：バッチファイルの作成**
**ステップ2：タスクスケジューラの設定**
**ステップ3：タスクの実行状況の確認**

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

## ステップ1：バッチファイルの作成
まず、以下のバッチファイルを作成し、OSの再起動とログ記録の処理を自動化します。
このスクリプトは、再起動前に確認を行い、再起動の成功または失敗をログファイルに記録します。

::: note info
ログファイルのパス設定は、ご自身の環境に合わせて適切に置き換えてください。
:::

```bat
@echo off
:: ログファイルのパスを設定
set LOG_FILE=C:\Users\Administrator\Desktop\reboot検証\log\reboot_log.txt

:: 現在の日時を取得
for /f "tokens=1-3 delims=/ " %%a in ('echo %date%') do (
    set month=%%a
    set day=%%b
    set year=%%c
)
for /f "tokens=1-2 delims=:. " %%a in ('echo %time%') do (
    set hour=%%a
    set min=%%b
)

:: ログ出力
echo %year%-%month%-%day% %hour%:%min% サーバーを再起動しますか？ (Y/N) >> %LOG_FILE%

:: 再起動前の確認
set /p choice=サーバーを再起動しますか？ (Y/N): 

:: 入力に応じた処理
if /i "%choice%"=="Y" (
    :: 10秒間のカウントダウン
    echo サーバーは10秒後に再起動します...
    for /l %%i in (10,-1,1) do (
        echo 再起動まで %%i 秒...
        timeout /t 1 /nobreak >nul
    )

    :: 再起動の実行
    echo %year%-%month%-%day% %hour%:%min% 再起動中... >> %LOG_FILE%
    shutdown /r /t 0
    echo %year%-%month%-%day% %hour%:%min% 再起動が成功しました。 >> %LOG_FILE%
) else (
    :: 再起動のキャンセル
    echo %year%-%month%-%day% %hour%:%min% 再起動をキャンセルしました。 >> %LOG_FILE%
)

:: スクリプト終了時に画面を閉じない
pause
```

このスクリプトは、再起動前に10秒間のカウントダウンを行い、ログファイルに「再起動の確認」「再起動の実行」「再起動をキャンセルする場合」などのメッセージを書き込みます。

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


プログラムの処理の流れは、以下となります。
```
  +-------------------------------+
  |           スタート             |
  +-------------------------------+
                |
                v
  +-------------------------------+
  | ログファイルのパス設定         |
  +-------------------------------+
                |
                v
  +-------------------------------+
  | 現在の日時を取得              |
  +-------------------------------+
                |
                v
  +-------------------------------+
  | ログ出力: 再起動の確認        |
  +-------------------------------+
                |
                v
  +-------------------------------+
  | 再起動前の確認                |
  | (Y/N 入力)                    |
  +-------------------------------+
         |                    |
         |                    |
         v                    v
+-------------------+   +-----------------------+
| 再起動を実行する  |   | 再起動をキャンセルする |
| (Yと入力)        |   | (Nと入力)              |
+-------------------+   +-----------------------+
         |                      |
         |                      |
         v                      v
+-------------------+   +-----------------------+
| 10秒間のカウントダウン|   | ログファイルにキャンセル|
| & 再起動を実行     |   | メッセージを書き込む    |
+-------------------+   +-----------------------+
         |                       
         v
+-------------------+
| スクリプト終了時に|
| 画面を閉じない    |
+-------------------+
```

実際のログファイルの内容は、以下のようになります。どのパターンでも想定通りのメッセージが書き込まれていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/20bf7d3f-d70d-ab98-07b0-c2fd3e4e71c5.png)



## ステップ2：タスクスケジューラの設定
次に、作成したバッチファイルをタスクスケジューラで自動実行する設定を行います。

実装手順は以下の通りです。

```
1. タスクスケジューラを開く：スタートメニューから「タスクスケジューラ」を検索して開きます。

2. タスクの作成：右側の「基本タスクの作成」をクリックし、名前と説明を入力します。

3. トリガーの設定：毎日朝の8時に実行する設定を行います。以下の手順でトリガーを設定します。
　・「トリガー」タブを選択し、「新規」をクリック
　・「1日ごと」にチェックを入れ、時間を「8:00:00」に設定
　・「有効」ボックスにチェックを入れ、「OK」をクリック
 
```

作成したreboot.batファイルが設定されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/190def3f-cf54-318e-a824-4e5f768241d8.png)

## ステップ3：タスクの実行状況の確認
定期再起動の時間になると、あらかじめ設定しておいたタスクが実行され、「サーバーを再起動しますか？ (Y/N)」というメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e0410e0b-f9a7-9d46-1191-88d70c409306.png)

10秒間のカウントダウンが始まりました。なんだがドキドキしますね（笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b3351cf7-1cc5-afd4-066d-a8bd5b6d05c8.png)

無事再起動されました。その後、RDP接続も問題なく実施できることを確認できましたので、検証完了になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/761dfef0-5afa-14fe-2b0e-a92f13254726.png)


## まとめ
本記事では、Windowsタスクスケジューラを使用して、reboot.batを毎日朝の8時に自動実行する設定手順を紹介しました。

これにより、手動でサーバーを再起動する手間を削減し、定期的なメンテナンスを自動化できます。

補足として、今回は検証目的でバッチファイルの中身を画面出力で確認する方法を使用しましたが、実務ではもっとシンプルに再起動のみを行うケースが多いです。


## おまけ
Linuxで定期的(ここでは30分おき)にスクリプトを自動実行するには、cronを使います。以下の手順の流れになります。

```
・ターミナルを開き、crontab -eコマンドでcronジョブの設定ファイルを編集します。

・エディタが開いたら、次の行を追加します：「*/30 * * * * /path/to/reboot.sh」

・/path/to/reboot.shは実行したいスクリプトのパスに置き換えてください。

・設定を保存してエディタを閉じます。

・cronサービスが自動で設定を反映します。

・スクリプトが30分おきに実行されるようになります。
```

これで、Linuxでもスクリプトが指定した間隔で自動的に実行されるようになります。

次回は、Linuxのシェルスクリプトを使い、さらにいろいろな検証をしてみたいと思います。

::: note warn
※バッチファイルはWindows専用のコマンドと構文を使っており、Linuxのシェルやコマンドライン環境とは互換性がないので、この手順で作成したバッチファイルはそのまま使えません。
:::

## 参考記事
https://qiita.com/hayakawa_qiita/items/bc8fdf02650d30900b3a

https://qiita.com/waokitsune/items/f7a57956dabeac3ff19e

https://pc-kaden.net/log/eid285.html

https://a-zs.net/inuwaka-batch-05/