連載
» 2019年01月10日 05時00分 公開

Tech TIPS:【まとめ】WSLでプロセスの一覧を確認する方法

WSL上でプロセスの動作状態を調べるために使うコマンドは? Windows OSユーザーのための、プロセス管理コマンドの基本をまとめておく。基本的にはLinuxのものと同じだが、WSLの実装上の制限などにより一部使えないコマンドもある点に注意してほしい。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 10 Fall Creators Update(バージョン1709)以降(64bit版のみ)


 Windows 10に「WSL(Windows Subsystem for Linux)」をインストールすると、Linux向けのプログラム(バイナリファイル)をそのまま実行できるようになる。現在では、UbuntuやDebian、SUSE Linux、WLinux(これはDebianベースの有償製品)など、数種類のLinuxディストリビューションを導入できるようになっている。またXサーバを導入することで、GUIのアプリケーションも利用できる。WSLの導入方法や、Xサーバを利用する方法については、以下の記事を参照していただきたい。

WSLのプロセスの一覧を調べるには?

 Windows OSで実行中のタスク(プロセス)の一覧を調べるには、GUIならタスクマネージャーやリソースモニター、CUIなら「tasklist.exe」コマンドやPowerShellの「Get-Process」コマンドレットなどを使うことが多いだろう。

 これらのツールを使うと、WSL上で動作しているプロセスも表示されるので、そのCPU使用率やメモリの使用状態なども確認できる。だがWSL以外のプロセスも表示されてしまうので分かりづらいところがある。WSL環境のプロセスの状態だけを素早く確認するなら、やはりWSL上で、WSL用の(正確にはLinux向けの)コマンドを利用するとよい。本TIPSでは、WSL(Linux)環境で利用できる、代表的なプロセス状態の確認用コマンドについてまとめておく。

WSL上で動作しているプロセスの一覧を調べる WSL上で動作しているプロセスの一覧を調べる
WSLのUbuntuディストリビューション上で、htopコマンドを実行して、WSLのプロセスなどの状態を確認しているところ。他にも数多くのプロセス表示用のコマンドがある。

一番基本のpsコマンド

 WSL(Linux)でプロセスの一覧を調べるための一番基本的なコマンドは「ps」コマンドである。

 オプション引数なしでpsを実行すると、現在ログインしている端末(コンソール)で自分が実行(起動)したプロセスの一覧が表示される。実行中のpsコマンドはもちろん、WSLのアイコンをクリックして起動したシェル(通常は/bin/bash)、およびそのシェルから起動してバックグラウンドに回したり、一時停止(sleep)させたりしているプロセス(bashでは「ジョブ」という。詳細は後述)などが表示される。

psコマンドでプロセスの一覧を確認する psコマンドでプロセスの一覧を確認する
引数なしでpsコマンドを実行すると、現在のコンソール(TTYの番号で識別される)で実行中のプロセスの一覧が表示される。

 表示されているのは、プロセスID(PID)と端末名(仮想コンソール名)、プロセスの実行時間、コマンド名である。プロセスIDは、Windows OSのタスクマネージャーなどで表示されているプロセスIDの番号とは異なり、WSL環境内だけで閉じたユニークな番号になっている。

●psの詳細表示オプション

 オプションとして「l(ロング)」や「u(ユーザーフレンドリーなフォーマット)」「v(仮想メモリの状態)」「e(環境変数)」などを付けると、より多くの情報が表示されるようになる。

ps uの実行例 ps uの実行例
psコマンドにuやl、vなどのオプションを付けると、より詳しい情報が表示される。

 例えば「STAT(ステータス、状態)」を見ると、プロセスの状態を確認できる。「S」ならスリープ中、「T」ならジョブコントロールなどによる停止中、「R」なら実行中などを表す。それぞれの各フィールドの詳細な意味については「man ps」コマンドなどを参照していただきたい。

●全プロセスの情報を表示させるオプション

 オプションとして「a(端末に割り当てられている全プロセス)」や「x(WSL上の全プロセス)」を付けると、現在のコンソールで実行しているプロセスだけでなく、他に起動している(同じディストリビューションの)WSLのコンソール上のプロセスや、バックグラウンドなどで実行されているWSLのプロセスなども全て表示される。先ほどの「l」や「u」「v」などのオプションと組み合わせて、「ps al」や「ps aux」のようにして使われることが多い。

ps auxの実行例 ps auxの実行例
(WSLの)システム内の全プロセスを表示させるには、「ps aux」がよく使われる。

プロセスの親子関係などを表示するpstreeコマンド

 プロセスには親子関係があったり(起動したプロセスと起動されたプロセスという関係)、1つのプロセスの中には複数のスレッドが含まれたりしているが、それらを確認するには、psコマンドに「f」オプションを付けるか、pstreeというコマンドを利用する。

プロセスの親子関係をツリー形式で表示させる プロセスの親子関係をツリー形式で表示させる
pstreeやps fコマンドを実行すると、プロセスの親子関係の状態が表示される。

プロセスの状態を継続的に表示し続けるtopコマンド

 psコマンドでは、psコマンドを実行した時点でのプロセスの一覧が表示されるだけだが、これをずっと連続して表示させ、リアルタイムにプロセスの状態を監視し続けるには、「top」コマンドや「htop」コマンドなどが利用できる。

 Linuxでは、これ以外にも「vmstat」や「dstat」など幾つか利用できるが、WSLは完全なLinuxエミュレーションを行っていない(できない)ため、うまく動作しなかったり、機能が制限されたりする。

 topコマンドを起動すると、画面上部にシステムの状態が、その下にプロセスの一覧が表示される。デフォルトでは3秒ごとに情報が更新される(間隔を変更するには「d」キーを押す)。

プロセスやシステムの状態をリアルタイムに監視するtopコマンド プロセスやシステムの状態をリアルタイムに監視するtopコマンド
プロセスやシステムの状態を継続的にモニターしたければ、「top」や「htop」などのコマンドを利用する。ただしWSLの実装上の理由により、Linux用のモニターツールが全てWSLでも利用できるわけではない。

 [?]を押すとヘルプが表示されるので、詳細はヘルプを参照して欲しいが、例えば[M]を押すとメモリの使用量順にソート、[P]を押すとCPU負荷順にソートなどが行える。他にも、表示する項目の設定やプロセス名の検索、コマンライン表示/ツリー表示の切り替え、プロセスの強制終了(キル)、表示色の変更など、多くのコマンドを持っている。終了するには[q]を押す。

WSLの「ロードアベレージ」はダミー値であることに注意

 UNIXやLinuxでは、システムの負荷状態を表すために、「ロードアベレージ」という指標を使うことがある。先ほどのtopコマンドの一番上に表示されている3つの数値がロードアベレージの値であり、他にも「w」や「uptime」「cat /proc/loadavg」などでも確認できる。3つの数字は、それぞれ、「過去1分間/5分間/15分間」のシステムの稼働状況の平均値を表す(値は、プロセスの実行待ちキューの長さなどに基づいて計算される。多数のプロセスを実行したり、頻繁なストレージアクセスを行ったりすると、より大きな値になる)。

WSLのロードアベレージ表示 WSLのロードアベレージ表示
WSLのロードアベレージの数値はダミーであり、いつも同じ値を返す。

 だがWSLで表示されているロードアベレージ値はダミーであり、常に「0.52/0.58/0.59」という値になっている。Windows OSとLinux OSではカーネルの構造が異なっているので厳密なエミュレーションが行えないため(次のTIPS参照)、このような仕様になっているようだ。WSLの負荷状況を詳しく知りたければ、ホスト側のWindows OSのタスクマネージャーなどで確認する必要がある。

bashのジョブコントロール機能でプロセスを管理する

 WSL(bash)では、起動したプロセスを一時的に止めたり(スリープさせたり)、バックグラウンドへ送って実行させたりする。このために使われるのがシェルの「ジョブコントロール」機能である。例えば「gzip datafile &」のように末尾に「&」記号を付けて実行したり、実行中のプロセスを[Ctrl]+[Z]でいったん止めてから「bg」コマンドを実行したりすると、そのプロセスはバックグラウンドで実行され、表側では別の作業を進めることができる。ジョブコントロール機能の詳細については、以下の記事を参照していただきたい。

 ジョブコントロールでは、プロセスをフォアグランドやバックグランドへ送ったり、実行が終了するまでウエイトしたり、強制的に終了(キル)したりできる。

 ジョブコントロールで管理されているプロセスは「jobs」コマンドで確認できる。ジョブコントロールの対象となるジョブ(プロセス)は、プロセスIDではなく、「%1」や「%%」などのジョブIDで簡単に指定できるようになる。

bashのジョブコントロールの例 bashのジョブコントロールの例
CUIの狭い画面が1つしかなくても、ジョブコントロール機能があればプログラムを切り替えながら使うことができる。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。