- Published on
WSL bashのプロセスを全てkillする
- Authors
- Name
- Shou Arisaka nyapp.buzz/shou
- short bio
- Z世代の情報技術者。Next.jsで自作SNSを個人開発中。
Windows LinuxのWSL Bashにおいて、起動しているプログラムやデーモン、バックグラウンドプロセスなどすべてのプロセスを終了、強制終了してkillするための方法についてです。

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

みなさんはWSL bashをどういうふうに使っていますか。conemuか、termuxとか、単にwin-Rからbash.exeを起動しているかも知れません。 wsl bashに限ったことではありませんが、ターミナルというものはどうも、コンソールウィンドウを閉じただけでは終了しないことが多いようです。
実際に、conemuやbashのウィンドウを全て閉じて、もうWSLのプロセスはないだろうな、と確信した状態でps fjx
といったコマンドを打って検証してみましょう。

不思議なことに、終了していたと思っていたプロセスが生き残っているではありませんか。
仕組みはよくわかりませんが、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%近く食っていたため、こりゃだめだ、と他の方法を探してみました。

見てのとおり、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"
と同じだと思います。試してないのでわからないですが。

そしてタスクマネージャーを見てみると、平和になっていますね。
上記ページを見る限り、どうやらこのプロセスはファイルの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
15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。