0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL の Ubuntu が時々落ちる。なので落ちても自動で起き上がるようにした

0
Posted at

image.png

背景

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 で自動起動する
  • 根本原因の調査は別途必要

仕組みとしてはかなり地味です。
でも、「落ちたら手で起こす」をやめられるだけで、だいぶ気が楽になりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?