ネットワークが落ちていたらWindowsを自動で再起動する
在宅勤務でリモートデスクトップ接続していると、ネットワークアダプタ周りのドライバやファームが原因でネットワークに繋がらなくなってしまうことがあります。(…え、ない?)
そんなときは再起動すれば大抵解決しますが、そのためにわざわざ出社はしたくない…。
そこで、ネットワークが落ちていたらWindowsを自動で再起動する方法を考えたので、忘れないようにメモ。
目的
ネットワークの不通を検知した場合、自動で再起動をかけることで復旧を試みる仕組みを作る。
やりかた
今回は、シンプルに以下のようなやり方を考えました。
- ネットワークの不通を検知すると再起動を行うバッチファイルを作成する
- 1.で用意したバッチファイルを、タスクスケジューラに登録して定期的に実行させる
以降、具体的にやったことを説明します。
ネットワークの不通を検知すると再起動を行うバッチファイルの作成
以下のような仕様でバッチファイルを作成しました。
- pingによってネットワークの不通を検知する
- pingの結果に「タイムアウト」が含まれている → 名前解決できている、つまりネットワークが生きていると判定1
- pingの結果に「タイムアウト」が含まれない → ネットワークが死んでいると判定し、再起動を実行する
- 再起動は、
shutdown
コマンドに「再起動」「3分後に実行」「強制」のオプションを指定する
なお、再起動に3分の時間をおいたのは安全のためです。
- 「出社時、ネットワークを切断した拍子に再起動してしまった」を防ぐ(
shutdown /a
で止められる) - 何かの拍子に、永遠に再起動し続けてしまうことを防ぐ2
バッチファイルの例は以下の通り。
@echo off
ping example.com -n 4 | find "タイムアウト"
@if errorlevel 1 GOTO test_NG
@if errorlevel 0 GOTO test_OK
:test_OK
echo network is up.
GOTO END
:test_NG
echo network is down.
shutdown /r /t 180 /f
GOTO END
:END
このバッチファイルをそのまま使おうとする場合には以下の点に注意。
example.com
にはそのネットワークにおいて解決できるドメイン名やホスト名を指定する必要があるping
が通る環境では以下の点にも注意- pingが通る環境で多くの人が同一設定にすると、攻撃になってしまう可能性もある
find "タイムアウト"
の箇所について、別のメッセージを検知する仕組みに変える必要がある
このバッチファイルを、restart_ifdown.bat
などの適当なファイル名で作成します。
用意したバッチファイルを、タスクスケジューラに登録して定期的に実行
タスクスケジューラを起動し、「新しいタスクの作成」を選択する。
タスクスケジューラに登録する際は以下のように設定を行う。
- 全般タブ:「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れる
- トリガータブ:以下の条件でトリガーを新規追加する
- タスクの開始:「スタートアップ時」に設定
- 繰り返し間隔:チェックを入れ、「5分間」を指定。
- 継続時間:「無制限」を指定
- 操作タブ:以下の条件で新規に追加する
- 操作は「プログラムの開始」を選択(デフォルト)
- 参照ボタンからバッチファイル(
restart_ifdown.bat
)を指定する
さいごに
一応、軽く動作確認くらいはしていますが、責任は負いません。
タスクスケジューラには実行ログがそこそこ残ってしまうと思うし、そもそもネットワークの不通検知の方法も雑なので、プロダクトレベルで使うにはもっと改善の余地があるはず。