背景
Windows 上で WSL2 の Ubuntu を常時動かしています。
ただ、たまに落ちます。気づかないまま放置して、中のサービスが止まっていたことが何度かありました。
原因調査も大事ですが、まずは落ちても勝手に復帰する状態を作ることにしました。
考え方
やり方はシンプルです。
- タスクスケジューラで、ログオン時に PowerShell を起動する
- その中で
wsl.exeを無限ループで実行する -
wsl.exeはsleep infinityで待ち続ける
WSL が落ちると wsl.exe が終了します。ループが 10 秒待ってから、もう一度 Ubuntu を起動します。
つまり、wsl.exe のプロセス自体が死活監視を兼ねています。
副作用もあります。WSL はプロセスが何も動いていないと、しばらくして自動停止します。常駐プロセスがあるので、勝手に止まることもなくなります。
設定手順
PowerShell で実行します(環境によっては管理者権限が必要です)。
ディストリビューション名は wsl -l -v で確認して、必要に応じて書き換えてください。
$cmd = 'while ($true) { wsl.exe -d Ubuntu-24.04 --exec sleep infinity; Start-Sleep 10 }'
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -WindowStyle Hidden -Command `"$cmd`""
$trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName 'WSL-KeepAlive' -Action $action -Trigger $trigger -Settings $settings
Start-ScheduledTask -TaskName 'WSL-KeepAlive'
動作確認
わざと WSL を止めてみます。
wsl --shutdown
10〜15 秒ほど待ってから、状態を確認します。
wsl -l -v
Running に戻っていれば成功です。
ハマりどころ
ExecutionTimeLimit は 0 にする
タスクスケジューラは、デフォルトで 72 時間経つとタスクを強制終了します。
これを忘れると、3 日後に監視が静かに止まります。
SYSTEM ではなく自分のユーザーで動かす
WSL のディストリビューションはユーザーごとに登録されています。
SYSTEM で動かすと、目的の Ubuntu が見つかりません。
中のサービスは systemd に任せる
この仕組みが起こすのは Ubuntu 本体だけです。
サービスも自動起動したい場合は、/etc/wsl.conf で systemd を有効にします。
[boot]
systemd=true
あとは sudo systemctl enable <サービス名> しておけば、Ubuntu の起動と一緒に立ち上がります。
限界
wsl.exe が終了せずに固まるケースは検知できません。
その場合は、定期的に wsl --exec true を叩くヘルスチェックを別途足す必要があります。
また、これはあくまで対症療法です。
メモリ不足が原因なら %USERPROFILE%\.wslconfig の memory / swap を見直すなど、根本対応も並行して進めるのがいいと思います。
不要になったら削除できます。
Unregister-ScheduledTask -TaskName WSL-KeepAlive -Confirm:$false
まとめ
- タスクスケジューラ + 無限ループで、WSL が落ちても自動復帰できる
-
wsl.exe --exec sleep infinityが死活監視と常駐の両方を担う -
ExecutionTimeLimitを 0 にしないと 72 時間で止まる - 中のサービスは systemd で自動起動する
- 根本原因の調査は別途必要
仕組みとしてはかなり地味です。
でも、「落ちたら手で起こす」をやめられるだけで、だいぶ気が楽になりました。
