プログラミング

WSL bashのプロセスを全てkillする

https://yuis.xsrv.jp/data/cnvMI3o2fojM8GUmcmv99twPxFUh1OoS.png

GUIとしてのubuntuは嫌いだけどCUIとしてのubuntuは大好き。yuisです。ところでもうすぐ.bashrcが12000行に到達します。感慨深い。

突然ですが、僕はパソコンというものはサーバーだと思っていて、再起動することはめったにありません。1ヶ月近く再起動をしないことも多々あります。
まぁそれなりの頻度で再起動はしないと、セキュリティアップデート的な意味でもよくありませんので、最低限の頻度は保ってはいます。

そしてそういうパソコンの使い方をしていると、どうしても、いつの間にかかさんでいるメモリ使用率やCPU使用率に悩まされます。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_35280b73-71fe-4a8a-97d4-18f833ba445b.png

みなさんはWSL bashをどういうふうに使っていますか。conemuか、termuxとか、単にwin-Rからbash.exeを起動しているかも知れません。
wsl bashに限ったことではありませんが、ターミナルというものはどうも、コンソールウィンドウを閉じただけでは終了しないことが多いようです。

実際に、conemuやbashのウィンドウを全て閉じて、もうWSLのプロセスはないだろうな、と確信した状態でps fjxといったコマンドを打って検証してみましょう。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_96541cc2-e2d8-4b1b-9ca0-f0c5419db068.png

不思議なことに、終了していたと思っていたプロセスが生き残っているではありませんか。

仕組みはよくわかりませんが、Linuxとはこういうものなんだ、としてこの場は抑えておきましょう。

さて、これらのプロセスを本当の意味で強制終了するにはどうしたらいいのでしょうか。

: kill all of pid within WSL

kill -9 $( ps fx -o pid )

適当にbashを立ち上げて上記コマンドを打つと、全てのプロセスを終了することができます。

ところで、killやその他多くのコマンドは複数の引数を配列として受け取ることができます。上記のそれも同様の理屈を応用して書かれています。
よくxargsを使って上記のそれと同様のことを面倒っぽく書く方がいますが、こちらの書き方の方が当然早いですし、書きやすいです。

ps fx -o pid | xargs kill

[追記] conhost.exeをkillしないと意味がないっぽい

追記です。より完全な方法を見つけましたので報告しておきます。

先刻、上記コマンドを実行したのにもかからわず、相変わらずコマンドラインのプロセスがCPUを50%近く食っていたため、こりゃだめだ、と他の方法を探してみました。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_f6e354d0-8a75-4912-95b6-0e8a2cdd94e0.png

見てのとおり、conhost.exeというプロセスがCPUを食っているので、こいつをpowershellかなんかでkillしてやればいいんだろうとは思いましたが、嫌な予感がしたのでとりあえず一度、これの終了方法について調べてみました。

そして以下。

windows 7 – (When) is CONHOST.EXE actually necessary? – Super User

とりあえず、これの強制終了は以下コマンドでできるようです。

taskkill /f /im conhost.exe

[注意] 上記コマンドはWSLだけでなく全てのコマンドラインプロセスに影響します。 e.g. powershell, cmd 一部のインストールプログラムはコマンドラインを使うことがあるので、特筆して何かのインストール中に実行するのは控えておくことをおすすめします。

CMDは疎いのでわからないですが、おそらく、やっていることはpowershellにおいてのStop-Process -Name "conhost"と同じだと思います。試してないのでわからんですが。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_3e70c2f5-45b4-4313-964a-8b955270eb99.png

そしてタスクマネージャーを見てみると、平和になっていますね。

上記ページを見る限り、どうやらこのプロセスはファイルのIOに通ずるものらしいですね。どうして50%もCPUを食うことになるのか。んー。
僕の場合は、2,3日経つと徐々にコマンドライン関連のCPUが全体的に上がってきて、最終的にあんな感じになるわけなのですが、そうですね。そうなるとおそらく、watchあたりが原因してるかもしれない。

watch -n 2.0 "cat \"${TIME_MANAGEMENT_DIR}/time_management_log.txt\" | awk '!/tmt-check/' | tail "

よくこんなコマンドを打つんですが、もしかするとこれが原因かもですね。んー、tail -fはawkでフィルタしたりとか細かいことができないですからね。

[追記] win-Rからコマンド実行すると楽

上記記事書いてから何度か強制終了のプロセスを経てきて、少し手順が洗練されましたのでご紹介します。

win-Rのショートカットキーでコマンドをぱぱっと実行できます。conemuとかのコンソールウィンドウが1つも開かれていない状態であれば、なおさら、わざわざcmd.exeを開いて実行したりするより楽です。あと、conemu上でbashをkillするコマンドを実行すると、たまに生き残りが出てきます。うまく閉じてくれていないというか。

taskkill /f /im conhost.exe