プロセス監視

はじめに

第12章はじめに

実行中（およびスリープ中）のプロセスを追跡することは、システム管理の重要なタスクです。psプログラムは、数十年にわたってUNIX系のオペレーティング システムの主要なツールでした。 

ただし、ユーティリティには複数のオペレーティング システムでさまざまに使用されてきた長い複雑な歴史があるため、混乱を招く組み合わせとなる多くのオプションが存在します。もう一つ信頼できるツールとしてtopがあり、システムの状態をインタラクティブに監視します。


学習目標
この章の終わりまでに、次のことができるようになります。

psを使用して、プロセスに関連する特性と統計情報を表示できます。
さまざまなps出力フィールドを識別し、ps出力をカスタマイズできます。
pstreeを使用して、プロセスの親子関係とマルチスレッド アプリケーションを視覚的に説明できます。
topを使ってシステムの負荷をインタラクティブに表示できます。


プロセス監視

プロセス監視ツール
このセクションでは、プロセスの監視について集中して述べます。Linux管理者は、プロセス監視にps、pstree、topなどの多くのユーティリティを使用します。これらはすべて、 UNIX系のオペレーティング システムで長く使われてきたものです。

繰り返しになりますが、プロセス監視の主要ツールのリストを確認してみましょう。

表：プロセスと負荷の監視ユーティリティ

ユーティリティ　内容　パッケージ
top　動的に更新、プロセスの活動状況の表示　procps
uptime　システムの稼働時間と平均負荷の表示　　procps
ps 　プロセスに関する詳細情報の表示　　procps
pstree　プロセスとその親子関係のツリー表示　　psmisc（またはpstree）
mpstat　マルチ プロセッサの使用量の表示　sysstat
iostat 　CPU使用率とI/O統計情報の表示　sysstat
sar　システムのアクティビティに関する情報の収集・表示　sysstat
numastat 　NUMA（Non-Uniform Memory Architecture）に関する情報の表示　numactl
strace　プロセスが行うすべてのシステムコールに関する情報を表示　strace
 
/procファイルシステムは、システム上のプロセスや他のアイテムの監視にも役立ちます。


psを使用したプロセス状態の表示
psは、プロセスに関連付けられた特性と統計情報を表示する、有用なツールです。これらの情報はすべて、プロセスに関連付けられた/procディレクトリから収集されます。

一般的なオプションの選択肢は次のとおりです。

$ ps aux

$ ps -elf

$ ps -eL

$ ps -C "bash"

このコマンド ユーティリティは、すべてのUNIX系のオペレーティング システムに異なる形で存在します。その多様性はLinuxバージョンのpsの雑多なオプションに反映されており、次の3つのカテゴリに分類されます。

UNIXオプション：前に「-」を付ける必要があり、グループ化ができます。
BSDオプション：前に「-」を付けることはできません。グループ化はできます。
GNUの長いオプション  それぞれの前に「--」が必要です。

これらのオプションがすべてある場合、かなり混乱します。ほとんどのシステム管理者は、日常的な使用で1つか2つの標準的な組み合わせを使用します。

提供されているスクリーンショットで、BSDオプションの一般的な使用法を確認できます。auxオプションはすべてのプロセスを示します。角括弧で囲まれたコマンド（ [ksoftirqd/0] など）は、すべてカーネル内に存在するスレッドです。各CPUに1つ存在する場合には、コマンドの後には実行されているCPUを示す整数が続きます。

BSDオプションでのpsの使用例

上記の例のほとんどのフィールドは説明しなくてもわかると思います。念のため、以下は説明します。

VSZはプロセスの仮想メモリ サイズで、単位はKBです。
RSSは常駐セット サイズです。タスクが使用しているスワップされていない物理メモリで、単位はKBです。
STATはプロセスの状態を表します。この例では、スリープ中はSのみ、実行中はRのみが表示されます。（プロセスが存在する場合）状態を示す文字は次のとおりです。
- <　優先度が高い（niceではない）
- N 　優先度が低い（nice）
- L 　ページをメモリにロックする
- s 　セッション リーダー
- l 　マルチスレッドの場合（プロセス生成中）
- +　フォアグラウンド プロセス グループに属している

fオプションを追加すると、どのような関係でプロセスがつながっているかが示されます。

$ ps auxf

ps auxf コマンドとその出力のスクリーンショット


ps出力のカスタマイズの例
-oオプションの後に、コンマで区切られたフィールド識別子のリストを指定すると、カスタマイズされたpsフィールドのリストを出力できます。

pid：プロセスID番号
uid：ユーザーID番号
cmd：すべての引数を指定したコマンド
cputime：CPU時間の累積
pmem：マシン上の物理メモリに対するプロセスの利用サイズの比率。パーセントで表示。

以下のスクリーンショットでpsの例を示します。他の多くの出力オプションについては、ps manページを参照してください。

ps出力のカスタマイズの例

提供されているスクリーンショットで、UNIXオプション形式の一般的な使用法を確認できます。親プロセスID（PPID）とnice値（NI）が表示されていることに注目してください。この例（RHEL 7から取得し、systemdを使用）で、多くのプロセスがPPID=2を示すことがわかります。これは、親プロセスが終了したときに内部カーネル プロセスkthreaddが子を引き継ぐように設計されており、新たな親になっていることを示しています。古いカーネルとシステムでは、sbin/initにPPID=1が表示されますが、実際には同じことが起こっています。

UNIXオプションでのpsの使用

UNIX形式の一般的な選択オプションは次のとおりです。

-Aまたは-e
すべてのプロセスを選択
-N
指定された条件を満たさないプロセスのみを選択 (選択の逆の意味)。
-C
コマンド名で選択
-G
実際のグループIDで選択（グループ名もサポート）
-U
実際のユーザーIDで選択（ユーザー名もサポート）


pstreeの使用方法
pstreeは、プロセスの親子関係とマルチスレッド アプリケーションについて、視覚的に示します。

$ pstree -aAp 2408

bash,2408
|-emacs,24998 pmonitor.tex
|  |-{emacs},25002
|  '-{emacs},25003
|-evince,18036 LFS201-SLIDES.pdf
|  |-{evince},18040
|  |-{evince},18046
|  '-{evince},18047

オプションの説明については、pstreeのmanページを参照してください。上記では、pid=2408の情報表示を選択しています。

子プロセスの1つ（evince, pid=18036）には、独自の子供が3つあることに注目してください。それを別の方法で確認するには以下を実行します。

$ ls -l /proc/18036/タスク

total 0
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18036
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18040
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18046
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18047


top
システムが何に時間を費やしているのかを知りたい場合、よく最初に使うツールがtopです。スクリーンショットは、引数なしでtopを使用したときの表示です。デフォルトでは、topは3.0秒ごとに自動的に更新されます。

topは古くからあるユーティリティであり、多数のオプションがあります。特定のキーが押されたときに実行されるインタラクティブなコマンドもその1つです。たとえば、1を押すと各CPUが個別に表示され、iを押すとアクティブなプロセスのみが表示されます。両方を実行すると何が得られるかを、スクリーンショットで確認できます。

topの使用例

プロセスのソート方法と表示されるフィールドを細かく制御できます。デフォルトでの表示以外にも多くのものがあります。たとえば、hまたは?を押すと対話型コマンドで簡単なリストを表示し、qで終了します。

さらに、kを押せばタスクを強制終了でき、rならばrenice（優先順位の変更）できます。

man topを実行すると、構成の情報、オプション、対話型の情報に関する広範なドキュメントが提供されます。

標準のtopプログラムに代わる人気のプログラムもあります。htop、ntop、atopなど、より視覚的なインターフェイスや追加情報を備えたものがあることを覚えておいてください。また、ほとんどのLinuxディストリビューションには、グラフィカル システム モニタ（gnome-system-monitorやksysguardなど）があり、topと似た表示ウィンドウがあります。


演習

課題 12.1: プロセス

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 12.1: Processes

1.  Run ps with the options -ef. Then run it again with the options aux. Note the differences in the output.
2.  Run ps so that only the process ID, priority, nice value, and the process command line are displayed.
3.  Start a new bash session by typing bash at the command line.  Start another bash session using the nice command but this time giving it a nice value of 10.
4.  Runpsas in step 2 to note the differences in priority and nice values. Note the process ID of the two bash sessions.
5.  Change the nice value of one of the bash sessions to 15 using renice. Once again, observe the change in priority and nice values.
6.  Run top and watch the output as it changes. Hit q to stop the program.

Solution 12.1

1.$ ps -ef
$ ps aux
2.$ ps -o pid,pri,ni,cmd
PID PRI  NI CMD
2389  19   0 bash
22079  19   0 ps -o pid,pri,ni,cmd
(Note: There should be no spaces between parameters.)
3.$ bash
$ nice -n 10 bash
$ ps -o pid,pri,ni,cmd
2389  19   0 bash
22115  19   0 bash
22171   9  10 bash
22227   9  10 ps -o pid,pri,ni,cmd
4.$ renice 15 -p 22171
$ ps -o pid,pri,ni,cmdP
ID PRI  NI CMD
2389  19   0 bash
22115  19   0 bash
22171   4  15 bash
22246   4  15 ps -o pid,pri,ni,cmd
5.$ top


課題 12.2: プロセスの状態を監視する

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 12.2: Monitoring Process States

1.  Useddto start a background process which reads from/dev/urandomand writes to/dev/null.
2.  Check the process state. What should it be?
3.  Bring the process to the foreground using the fg command.  Then hit Ctrl-Z. What does this do?Look at the process state again, what is it?
4.  Run the jobs program. What does it tell you?
5.  Bring the job back to the foreground, then terminate it usingkillfrom another window.

Solution 12.2

1.$ dd if=/dev/urandom of=/dev/null &
2.$ ps -C dd -o pid,cmd,stat
25899 dd if=/dev/urandom of=/dev/ R
Should beSorR.
3.$ fg
$ ˆZ
$ ps -C dd -o pid,cmd,stat
PID CMD                         STAT
25899 dd if=/dev/urandom of=/dev/ T
State should beT.
4.  Type the jobs command. What does it tell you?
$ jobs
[1]+  Stopped                 dd if=/dev/urandom of=/dev/null
5.  Bring the job back to the foreground, then kill it using the kill command from another window.
$ fg
$ kill  25899


知識チェック

「第12章 - プロセスの監視」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 12.1
プロセス監視ツールは次のうちどれですか？当てはまるものをすべて選択してください。

A. sysctl
B. ps
C. top
D. pstree
E. df

問題 12.2
システム上の、すべてのプロセスの親プロセスID（PPID）を表示するコマンドはどれですか。

A. ps aux
B. ps elf
C. ps-aux
D. ps -elf

