WSL上でプロセスの動作状態を調べるために使うコマンドは? Windows OSユーザーのための、プロセス管理コマンドの基本をまとめておく。基本的にはLinuxのものと同じだが、WSLの実装上の制限などにより一部使えないコマンドもある点に注意してほしい。
対象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サーバを利用する方法については、以下の記事を参照していただきたい。
Windows OSで実行中のタスク(プロセス)の一覧を調べるには、GUIならタスクマネージャーやリソースモニター、CUIなら「tasklist.exe」コマンドやPowerShellの「Get-Process」コマンドレットなどを使うことが多いだろう。
これらのツールを使うと、WSL上で動作しているプロセスも表示されるので、そのCPU使用率やメモリの使用状態なども確認できる。だがWSL以外のプロセスも表示されてしまうので分かりづらいところがある。WSL環境のプロセスの状態だけを素早く確認するなら、やはりWSL上で、WSL用の(正確にはLinux向けの)コマンドを利用するとよい。本TIPSでは、WSL(Linux)環境で利用できる、代表的なプロセス状態の確認用コマンドについてまとめておく。
WSL(Linux)でプロセスの一覧を調べるための一番基本的なコマンドは「ps」コマンドである。
オプション引数なしでpsを実行すると、現在ログインしている端末(コンソール)で自分が実行(起動)したプロセスの一覧が表示される。実行中のpsコマンドはもちろん、WSLのアイコンをクリックして起動したシェル(通常は/bin/bash)、およびそのシェルから起動してバックグラウンドに回したり、一時停止(sleep)させたりしているプロセス(bashでは「ジョブ」という。詳細は後述)などが表示される。
表示されているのは、プロセスID(PID)と端末名(仮想コンソール名)、プロセスの実行時間、コマンド名である。プロセスIDは、Windows OSのタスクマネージャーなどで表示されているプロセスIDの番号とは異なり、WSL環境内だけで閉じたユニークな番号になっている。
オプションとして「l(ロング)」や「u(ユーザーフレンドリーなフォーマット)」「v(仮想メモリの状態)」「e(環境変数)」などを付けると、より多くの情報が表示されるようになる。
例えば「STAT(ステータス、状態)」を見ると、プロセスの状態を確認できる。「S」ならスリープ中、「T」ならジョブコントロールなどによる停止中、「R」なら実行中などを表す。それぞれの各フィールドの詳細な意味については「man ps」コマンドなどを参照していただきたい。
オプションとして「a(端末に割り当てられている全プロセス)」や「x(WSL上の全プロセス)」を付けると、現在のコンソールで実行しているプロセスだけでなく、他に起動している(同じディストリビューションの)WSLのコンソール上のプロセスや、バックグラウンドなどで実行されているWSLのプロセスなども全て表示される。先ほどの「l」や「u」「v」などのオプションと組み合わせて、「ps al」や「ps aux」のようにして使われることが多い。
プロセスには親子関係があったり(起動したプロセスと起動されたプロセスという関係)、1つのプロセスの中には複数のスレッドが含まれたりしているが、それらを確認するには、psコマンドに「f」オプションを付けるか、pstreeというコマンドを利用する。
psコマンドでは、psコマンドを実行した時点でのプロセスの一覧が表示されるだけだが、これをずっと連続して表示させ、リアルタイムにプロセスの状態を監視し続けるには、「top」コマンドや「htop」コマンドなどが利用できる。
Linuxでは、これ以外にも「vmstat」や「dstat」など幾つか利用できるが、WSLは完全なLinuxエミュレーションを行っていない(できない)ため、うまく動作しなかったり、機能が制限されたりする。
topコマンドを起動すると、画面上部にシステムの状態が、その下にプロセスの一覧が表示される。デフォルトでは3秒ごとに情報が更新される(間隔を変更するには「d」キーを押す)。
[?]を押すとヘルプが表示されるので、詳細はヘルプを参照して欲しいが、例えば[M]を押すとメモリの使用量順にソート、[P]を押すとCPU負荷順にソートなどが行える。他にも、表示する項目の設定やプロセス名の検索、コマンライン表示/ツリー表示の切り替え、プロセスの強制終了(キル)、表示色の変更など、多くのコマンドを持っている。終了するには[q]を押す。
UNIXやLinuxでは、システムの負荷状態を表すために、「ロードアベレージ」という指標を使うことがある。先ほどのtopコマンドの一番上に表示されている3つの数値がロードアベレージの値であり、他にも「w」や「uptime」「cat /proc/loadavg」などでも確認できる。3つの数字は、それぞれ、「過去1分間/5分間/15分間」のシステムの稼働状況の平均値を表す(値は、プロセスの実行待ちキューの長さなどに基づいて計算される。多数のプロセスを実行したり、頻繁なストレージアクセスを行ったりすると、より大きな値になる)。
だがWSLで表示されているロードアベレージ値はダミーであり、常に「0.52/0.58/0.59」という値になっている。Windows OSとLinux OSではカーネルの構造が異なっているので厳密なエミュレーションが行えないため(次のTIPS参照)、このような仕様になっているようだ。WSLの負荷状況を詳しく知りたければ、ホスト側のWindows OSのタスクマネージャーなどで確認する必要がある。
WSL(bash)では、起動したプロセスを一時的に止めたり(スリープさせたり)、バックグラウンドへ送って実行させたりする。このために使われるのがシェルの「ジョブコントロール」機能である。例えば「gzip datafile &」のように末尾に「&」記号を付けて実行したり、実行中のプロセスを[Ctrl]+[Z]でいったん止めてから「bg」コマンドを実行したりすると、そのプロセスはバックグラウンドで実行され、表側では別の作業を進めることができる。ジョブコントロール機能の詳細については、以下の記事を参照していただきたい。
ジョブコントロールでは、プロセスをフォアグランドやバックグランドへ送ったり、実行が終了するまでウエイトしたり、強制的に終了(キル)したりできる。
ジョブコントロールで管理されているプロセスは「jobs」コマンドで確認できる。ジョブコントロールの対象となるジョブ(プロセス)は、プロセスIDではなく、「%1」や「%%」などのジョブIDで簡単に指定できるようになる。
Copyright© Digital Advantage Corp. All Rights Reserved.