WSLのLinuxをシャットダウンしたい

Windows 10 春のアップデートで、WSLで動作するプロセスをバックグラウンドで動作させることが可能になった。これでLinuxで動作するデーモンを簡単に利用することができるようになり、WSL活用の幅が広がった。しかし同時に、バックグラウンドで動作しているプロセスをまとめて終了する方法がないということにお気づきの方もいるのではないだろうか。Linuxから個別にサービスを制御することはできるのだが、まとめて終了する方法がないのだ。要するに、システムをシャットダウンする方法がないのである。

WSLで動作するUbuntu 18.04 LTS

WSLはそもそもLinuxのシステムコールをWindowsカーネルで処理できるようにする互換レイヤー技術であって、仮想環境ではない。仕組み上、Linux側から再起動することはできないようになっている。しかし、これは案外使いにくい。

例えば、shutdownコマンドやrebootコマンドをWSLで実行すると、次のようにコマンドが機能しないことを確認できる。

WSLではshutdownコマンドやrebootコマンドは機能しない

希望としては、WSL内部で「sudo shutdown -r now」のようにコマンドを実行するとLinux関連の終了処理が走って、動作しているLinuxプロセスは全て適切に終了し、再び対象ディストリビューションの起動処理が走り、bashが起動する、となってほしい。そこまではたぶん実現しないとは思うのだが(ただし、できなくもないので、どうなるかはわからない)、次のWindows 10アップデートで状況は多少マシになるとされている。

あがいてみても……

Windows側から見ると、次のようにWSLで動作しているプロセスを確認できる。

Windows 10からWSLで動作するプロセスを確認

Windows 10 春のアップデートのままで、シャットダウン処理的なことができないかあがいてみよう。例えば、WSLからinit (プロセス番号1)にシグナル12を送信してみるとか、Windows 10からLxssManagerを終了してみるとか、まとめてプロセスを終了するような処理を行ってみる。しかし、プロセスのいくつかは終了させることができるものの、あまりうまくいかない。

操作の影響でnginxが落ちた状態のUbuntu

Linux側では終了したとされるプロセスが、Windows 10側からは認識されたままの状態になる。

Linux側からは見えないが、Windows側には残ってしまったプロセス

これはサインアウト/サインインでクリアすることができるのだが、そうしたアクションなしでも綺麗に決まってほしい。このあたりは今後改善を期待したいところである。いずれにせよ、現状では簡単にシャットダウンに変わる処理を走らせるのは面倒な状態にある。

将来的には「wslconfig /terminate」

現状では、LWSのLinuxを綺麗な状態に戻すにはサインアウト/サインインを繰り返したり、Windows 10を再起動したりするしかないのだが、次のWindows 10アップデートではもっと簡単になるとされている。

Windows 10 Insider Preview build 17704で取り込まれた機能

Windows 10 Insider Preview build 17704で取り込まれた機能に「wslconfig /terminate」というものがあり、このコマンドが対象となるLinuxディストリビューションの終了処理を行ってくれるようになる。つまり、Linux側からshutdownを実行する代わりに、Windows 10側からwslconfigコマンドを実行して対象Linuxを終了することが可能になるということだ。この機能が取り込まれると、Linux環境の再起動を簡単に実施できるようになる。

開発が進むWSLが楽しみ

WSLの開発は急ピッチで進んでいるように見える。ユーザーから多くの要望が出て、可能な部分からWSLへの取り込みが進んでいるようだ。2018年秋のWindows 10アップデートではすでにいくつもの待ち望まれた機能の取り込みが予定されている。WSLを利用するユーザーにとって、今後のリリースは楽しみが多い。