WSL2の一部or全ディストリを終了・再起動する方法

2020年8月28日WSL 2Linux,Ubuntu,Windows,WSL2

WSL2(Windows Subsystem for Linux)でいろいろソフトを正しく入れたはずなのに、なぜか動かない、ということがあります。また、vmmemというWSL2関連のプロセス(厳密に言うとHyper-V関連のプロセス)が、CPUやメモリなどのリソースを食いつぶしてしまうことがあります。

そんなときは、WSL2の再起動を試してみてください。この記事では、Windowsは起動したまま、WSL2環境の全ディストリビューションor一部のディストリビューションを終了・再起動する方法をまとめました。

WSL2の終了のしかた

特定のディストリを終了するには

WSL2で動いているディストリビューションは、wsl -t <ディストリ名>で終了することができます。

実際に試してみます。まず、wsl -l -vで、どのディストリビューションが動いているか確認してみます。

PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  Ubuntu-18.04           Stopped         2
  docker-desktop-data    Running         2
  Ubuntu                 Running         2
  docker-desktop         Running         2

今回は、Ubuntu 20.04を終了してみます。ディストリ名にUbuntu-20.04を指定して、wsl -t Ubuntu-20.04を実行すると、Ubuntu 20.04だけ終了できます。

PS C:\> wsl -t Ubuntu-20.04

何も表示されずプロンプトが帰ってきますが、もう一度ディストリビューションのリストを表示してみます。

PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2
  Ubuntu-18.04           Stopped         2
  docker-desktop-data    Running         2
  Ubuntu                 Running         2
  docker-desktop         Running         2

Ubuntu-20.04がStoppedになって、終了したことが分かりました。

何らか、Ubuntu 20.04でソフトを実行していた場合は、強制終了されます。下の右図は、Ubuntu 20.04のBashを起動していたところですが、その状態で左図のように終了コマンドを打つと、Bashも終了します。(Bashのヒストリーが保存されずに終了しますので、Ubuntuが動いたまま終了コマンドを打つのはおすすめしません)

Ubuntuが動いた状態で「wsl -t」すると、Ubuntuも強制終了します

ちなみに、終了するコマンドの-tは、–terminateの短縮オプションです。従って、終了するコマンドはwsl --terminate Ubuntu-20.04としても同じ動きになります。

すべてのディストリを終了するには

上記では、特定のディストリビューションを指定して終了しましたが、すべてのディストリビューションを終了することもできます。それには、wsl --shutdownを実行します。

例えば、下図のようにUbuntu 20.04とDockerが動いている状態だとします。

「wsl -l -v」で各ディストリのステータスを確認

この状態でwsl --shutdownを実行すれば、下図のようにUbuntu 20.04もDockerも終了します。

「wsl --shutdown」すると、全ディストリとも終了します

すべてのディストリビューションがStoppedになっていることが分かります。

UbuntuなどのLinuxディストリビューションだけでなく、WSL2バックエンドなDocker Desktopも落ちてしまいますので、Dockerも使っている人は気をつけてください。Docker Dashboardを見ていても違いが現れませんが、タスクバーのアイコンにマウスを乗せると「Docker has stopped」となって、コンテナのないクジラマークになっていると思います。

WSL2を再起動するには

再起動は、特に明示的に指定する必要はありません。

Windows Terminalで新規のUbuntuタブを開く、Ubuntu2004.exeを実行する、スタートメニューからUbuntu 20.04を選択する、など、通常通りUbuntuを起動すればOKです。

Dockerについては、タスクバーのDockerアイコンを右クリックしてRestartを選択すれば起動します。

おまけ

Ubuntu側から終了する

上記のwslコマンドは、組み込みコマンドではなく、wsl.exeという外部コマンドです。

末尾の.exeをちゃんと入力すれば、Ubuntu環境からでもパスの通ったWindows用exeファイルを実行できますので、Ubuntu側から終了コマンドを打つこともできます。

username@z390:~$ wsl.exe -t Ubuntu-20.04
Ubuntu側からでも、自分自身をシャットダウンできます

それ以降、何もできなくなるので、特にメリットはありません。

以前の情報(WSLサービスの終了)

ネットで調べると、以前はWindows側からWSL関連のサービスを終了する、という方法が紹介されていました。管理者権限でnet stop LxssManagerを実行すると、WSLサービスを終了できます。イメージ的には、wsl --shutdownと似た動きです。

PS C:\WINDOWS\system32> net stop LxssManager
LxssManager サービスを停止中です.
LxssManager サービスは正常に停止されました。

こちらの記事もどうぞ

当ブログでは、他にもWSL2関連の記事を公開しています。良ければ、これらもご覧ください。