Red Hat Enterprise Linux でのプロセス監視

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、システム管理者や開発者にとって不可欠なスキルである、Linux プロセスの監視と管理について実践的な経験を積みます。pstop を使ってプロセスの状態とライフサイクルを理解し、バックグラウンドとフォアグラウンドのジョブを制御し、killkillallpkill を使ってプロセスを効果的に終了する方法を学びます。さらに、uptimelscpu を使ってシステム負荷と CPU 使用率を監視し、top を使ってプロセスのアクティビティを詳細に分析します。この実験では、RHEL 上でプロセスを効率的に管理し、システムの健全性を維持するための必須ツールと知識を習得します。

ps コマンドと top コマンドによるプロセス状態とライフサイクルの理解

このステップでは、Linux プロセスの状態とそのライフサイクルについて学びます。プロセス状態を理解することは、システムリソースを効果的に監視および管理するために不可欠です。ps コマンドと top コマンドを使用して、プロセスとその状態を観察します。

Linux の各プロセスは、その現在の活動状態を表す状態を持ちます。これらの状態はカーネルによって定義され、プロセスが実行中、スリープ中、停止中、またはその他の状態にあることを示します。

まず、ps コマンドを使用してプロセス状態を見てみましょう。ps コマンドは、現在のプロセスのスナップショットを表示します。

最初に、ターミナルを開きます。デスクトップのターミナルアイコンをクリックするか、Ctrl+Alt+T を押すことで開くことができます。デフォルトの作業ディレクトリは ~/project です。

システム上で実行中のすべてのプロセス(制御端末を持たないプロセスも含む)を表示するには、ps aux コマンドを使用します。aux オプションは、すべてのユーザー(a)が所有するプロセス、制御端末を持たないプロセス(x)、ユーザー向けフォーマット(u)を表示します。

ps aux

多くのプロセスのリストが表示されます。各プロセスの状態を示す STAT カラムに注意してください。観察される可能性のある一般的な状態は次のとおりです。

  • R: 実行中または実行可能(CPU 上または実行待ち)
  • S: 中断可能なスリープ(イベントが完了するまで待機)
  • D: 中断不可能なスリープ(I/O を待機中、中断できません)
  • T: 停止中(シグナルによって一時停止)
  • Z: ゾンビ(プロセスは終了したが、親プロセスが終了ステータスを回収していない)
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 171820 16140 ?        Ss   HH:MM   0:01 /usr/lib/systemd/systemd ...
root           2  0.0  0.0      0     0 ?        S    HH:MM   0:00 [kthreadd]
labex       3448  0.0  0.2 266904  3836 pts/0    R+   HH:MM   0:00 ps aux
...出力省略...

次に、ps -ef コマンドを使用してみましょう。このコマンドは、すべてのプロセス(e)の完全なリスト(f)を提供し、親プロセス ID (PPID)、CPU 使用率 (C)、開始時間 (STIME)、コマンド (CMD) などの詳細情報を表示します。

ps -ef

この出力は、プロセス間の親子関係を確認するために頻繁に使用されますが、明示的にツリー構造を表示するわけではありません。

UID        PID  PPID  C STIME TTY          TIME CMD
root           1       0  0 HH:MM ?        00:00:01 /usr/lib/systemd/systemd ...
root           2       0  0 HH:MM ?        00:00:00 [kthreadd]
root           3       2  0 HH:MM ?        00:00:00 [rcu_gp]
...出力省略...

プロセス階層を視覚化するには、ps --forest オプションを使用できます。これにより、プロセスが他のプロセスを生成した関係を理解しやすくなるように、ツリー形式でプロセスを表示します。

ps --forest

このコマンドは、システム上のさまざまなサービスやアプリケーションの構造をデバッグし、理解するために特に役立ちます。

  PID TTY          TIME CMD
 2768 pts/0    00:00:00 bash
 5947 pts/0    00:00:00  \_ sleep 10000
 6377 pts/0    00:00:00  \_ ps --forest
...出力省略...

次に、実行中のシステムの動的なリアルタイムビューを提供する top コマンドを調べてみましょう。システム情報の概要と、現在 Linux カーネルによって管理されているプロセスまたはスレッドのリストを表示します。

top コマンドを実行します。

top

インタラクティブな表示が表示されます。上部セクションには、稼働時間、平均負荷、タスク概要、CPU 統計情報、メモリ使用量などのシステム情報概要が表示されます。下部セクションには、デフォルトでは CPU 使用率順に並べられた個々のプロセスが表示されます。

top の出力では、ps と同様に S カラムにプロセス状態が表示されます。また、各プロセスの %CPU(CPU 使用率)と %MEM(メモリ使用率)も確認できます。

top - HH:MM:SS up DD min,  X users,  load average: X.XX, X.XX, X.XX
Tasks: XXX total,   X running, XXX sleeping,   X stopped,   X zombie
%Cpu(s):  X.X us,  X.X sy,  X.X ni, XX.X id,  X.X wa,  X.X hi,  X.X si,  X.X st
MiB Mem :   XXXX.X total,   XXXX.X free,    XXX.X used,    XXX.X buff/cache
MiB Swap:   XXXX.X total,   XXXX.X free,      X.X used.   XXXX.X avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
XXXX labex     20   0  XXXXXX   XXXX   XXXX R   X.X   X.X   0:00.0X top
...出力省略...

top を実行している間は、q キーを押して終了し、ターミナルプロンプトに戻ることができます。

これらのコマンドとそれらが提供する情報について理解することは、Linux システム上でプロセスを監視およびトラブルシューティングするために不可欠です。

バックグラウンドとフォアグラウンドジョブの制御

このステップでは、シェルセッション内でバックグラウンドとフォアグラウンドのジョブを管理する方法を学びます。これは、効率的なコマンドライン使用のための基本的なスキルであり、ターミナルを占有することなく、長時間実行するタスクを実行できます。

シェルのコンテキストにおける「ジョブ」とは、シェルが管理するコマンドまたはコマンドのパイプラインを指します。ジョブをバックグラウンドで実行したり、フォアグラウンドに移動させたり、一時停止したりできます。

まず、バックグラウンドで単純なコマンドを実行してみましょう。sleep コマンドを使用します。これは、指定された時間だけ待機するコマンドです。

sleep 10000 (10000 秒待機) をバックグラウンドで実行するには、コマンドにアンパサンド (&) を追加します。

sleep 10000 &

Enter キーを押すと、シェルはすぐにプロンプトに戻り、sleep コマンドはバックグラウンドで実行されます。ジョブ番号とそのプロセス ID (PID) を示す、次の様な出力が出力されます。

[1] 5947

[1] は、現在のシェルセッションにおけるジョブ番号 1 を、5947sleep プロセスの PID を示します。

シェルが現在管理しているすべてのジョブのリストを表示するには、jobs コマンドを使用します。

jobs

sleep コマンドが実行中のバックグラウンドジョブとしてリストされているはずです。

[1]+ Running    sleep 10000 &

[1] の横にある + は、これが現在のジョブ(ジョブ番号を指定しなかった場合、デフォルトで処理されるジョブ)であることを示します。

次に、このバックグラウンドジョブをフォアグラウンドに移動させましょう。これは、ジョブが再びターミナルを制御することを意味します。fg コマンドにジョブ番号(% で接頭辞)を指定します。

fg %1

sleep 10000 コマンドがフォアグラウンドになります。ターミナルはこのコマンドに占有され、終了または一時停止されるまでプロンプトは表示されません。

sleep 10000

コマンドがフォアグラウンドで実行されている間、Ctrl+Z を押すことでバックグラウンドに移動し、一時停止できます。これにより、プロセスに SIGTSTP シグナルが送信されます。

Ctrl+Z を押します。

^Z

ジョブが停止し、バックグラウンドに移動したことを示す出力が表示されます。

[1]+  Stopped                 sleep 10000

jobs コマンドをもう一度実行すると、sleep コマンドが Stopped 状態にあることがわかります。

jobs
[1]+ Stopped                 sleep 10000

停止したバックグラウンドジョブを再開するには、bg コマンドにジョブ番号を指定します。これにより、ジョブはバックグラウンドで再び実行されます。

bg %1

ジョブは再びバックグラウンドで実行されます。

[1]+ sleep 10000 &

最後に、バックグラウンドジョブをクリーンアップしましょう。バックグラウンドジョブを終了するには、kill コマンドを使用してその PID を指定するか、フォアグラウンドに移動させてから終了します(例:Ctrl+C)。今回は、フォアグラウンドに移動させて終了します。

fg %1

sleep 10000 がフォアグラウンドにあるので、Ctrl+C を押して終了します。これにより、プロセスに SIGINT シグナルが送信されます。

^C

ジョブが終了したことを示すメッセージが表示されます。

[1]+  Terminated              sleep 10000

jobs コマンドをもう一度実行すると、ジョブがリストされていないことがわかります。

jobs
(no output)

これで、ターミナルでのマルチタスクに不可欠な、バックグラウンドとフォアグラウンドでのジョブ管理の基本的なワークフローが示されました。

kill, killall, pkill コマンドによるプロセスの終了

このステップでは、kill, killall, pkill コマンドを使用してプロセスを終了する方法を学びます。これらのコマンドは、システムリソースの管理と、動作異常なアプリケーションの停止に不可欠です。

Linux のプロセスはシグナルに応答します。シグナルは、プロセスに送信されるソフトウェアの割り込みです。異なるシグナルは、プロセスを終了する、一時停止する、または構成ファイルを再読み込みさせるなど、異なる意味を持ちます。

まず、いくつかの基本的なプロセス管理シグナルについて理解しましょう。

  • SIGTERM (15): kill コマンドによってデフォルトで送信されるシグナル。プロセスを終了するための「丁寧な」要求です。プロセスはこのシグナルを受け取り、クリーンアップしてから終了できます。
  • SIGKILL (9): 強制的な即時終了を行う「ブロック不可能な」シグナル。プロセスは無視したり、処理したりできません。最後の手段として使用してください。
  • SIGHUP (1): プロセスを再起動せずに構成ファイルの再読み込みを行うために使用されることがよくあります。
  • SIGINT (2): Ctrl+C を押すことで送信され、通常はフォアグラウンドプロセスを中断するために使用されます。
  • SIGSTOP (19): プロセスを一時停止します。ブロックしたり、処理したりできません。
  • SIGCONT (18): 一時停止したプロセスを再開します。

利用可能なすべてのシグナルとその番号は、kill -l を使用して表示できます。

kill -l

次の様なシグナルのリストが表示されます。

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
...出力省略...

kill の使用

kill コマンドは、プロセス ID (PID) で識別されるプロセスに、指定されたシグナルを送信します。

終了の練習をするために、いくつかのバックグラウンドプロセスを作成しましょう。再び sleep コマンドを使用します。

sleep 300 &
sleep 301 &
sleep 302 &

jobs を使用して、それらのジョブ番号と PID を確認します。

jobs
[1] 1234
[2] 1235
[3] 1236

(注:実際の PID は異なります。)

最初の sleep プロセスの PID を見つけましょう。ps aux | grep sleep を使用して、sleep 300 に関連付けられた PID を探します。

ps aux | grep sleep

次の様な出力が表示されます。sleep 300 の PID を特定します。例えば、PID が 1234 の場合:

labex       1234  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 300
labex       1235  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 301
labex       1236  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 302
labex       1237  0.0  0.0   6000  1000 pts/0    S+   HH:MM   0:00 grep sleep

デフォルトの SIGTERM シグナルを使用して sleep 300 を終了するには、kill に続けてその PID を使用します。1234 を実際に見つかった PID に置き換えます。

kill 1234

[1]+ Terminated sleep 300 といったメッセージが表示されるかもしれません。jobs または ps aux | grep sleep を使用して、それが終了したことを確認します。

jobs
[2]- Running    sleep 301 &
[3]+ Running    sleep 302 &

次に、SIGKILL を使用して sleep 301 を強制終了します。その PID (例:1235) を見つけて、kill -9 または kill -SIGKILL を使用します。

kill -9 1235

おそらく [2]- Killed sleep 301 というメッセージが表示されます。再度確認します。

jobs
[3]+ Running    sleep 302 &

killall の使用

killall コマンドは、PID ではなく名前でプロセスを終了します。指定されたコマンド名と一致するすべてのプロセスにシグナルを送信します。

さらにいくつかの sleep プロセスを作成します。

sleep 303 &
sleep 304 &
sleep 305 &

実行されていることを確認します。

jobs
[3] Running    sleep 302 &
[4] Running    sleep 303 &
[5] Running    sleep 304 &
[6] Running    sleep 305 &

これで、killall を使用してすべての sleep プロセスを終了します。デフォルトでは、killallSIGTERM を送信します。

killall sleep

終了した各 sleep プロセスに関するメッセージが表示されます。すべての sleep プロセスが終了したことを確認します。

jobs
(no output)

pkill の使用

pkill コマンドは killall と似ていますが、コマンド名、ユーザー ID、グループ ID、制御端末など、より高度な選択基準を提供し、パターンマッチングも可能です。特定のプロセスセットをターゲットにするのに非常に強力です。

pkill のためにいくつかの新しい sleep プロセスを作成します。

sleep 306 &
sleep 307 &
sleep 308 &

実行されていることを確認します。

jobs
[1] Running    sleep 306 &
[2] Running    sleep 307 &
[3] Running    sleep 308 &

現在のユーザー (labex) が所有するすべての sleep プロセスを終了するには、pkill -u labex sleep を使用できます。

pkill -u labex sleep

このコマンドは、labex ユーザーに属するすべての sleep プロセスを終了します。

すべての sleep プロセスが終了したことを確認します。

jobs
(no output)

pkill はパターンとも使用できます。たとえば、my_app_v1my_app_v2 という名前のプロセスがあった場合、pkill my_app で両方を終了できます。

これらのコマンドは、PID で単一のプロセスをターゲットにすることから、名前やその他の属性に基づいて複数のプロセスを終了するまで、プロセスを管理および終了するための柔軟な方法を提供します。kill -9 または SIGKILL を使用する際は、プロセスがクリーンアップする機会がない場合、データ損失につながる可能性があるため、常に注意してください。

uptime と lscpu によるシステム負荷と CPU 使用率の監視

このステップでは、uptimelscpu コマンドを使用して、システムの負荷平均と CPU 使用率を監視する方法を学びます。これらの指標を理解することは、システムのパフォーマンスを評価し、潜在的なボトルネックを特定するために非常に重要です。

uptime による負荷平均の理解

uptime コマンドは、システムの稼働時間、ログインしているユーザー数、そして最も重要なシステムの負荷平均を簡単に確認できます。負荷平均は、ある期間に実行可能状態または中断不可能状態にあるプロセスの平均数を示します。

uptime コマンドを実行します。

uptime

次の様な出力が表示されます。

HH:MM:SS up DD min,  X users,  load average: X.XX, X.XX, X.XX

出力の詳細を説明します。

  • HH:MM:SS: 現在の時刻。
  • up DD min: システムの稼働時間 (アップタイム)。
  • X users: 現在ログインしているユーザー数。
  • load average: X.XX, X.XX, X.XX: この 3 つの数値は、それぞれ過去 1 分間、5 分間、15 分間のシステム負荷平均を表します。

シングルコア CPU で負荷平均が 1.00 の場合、CPU は完全に使用されています。マルチコア CPU の場合、負荷平均が CPU コア数に等しい場合、システムは完全に使用されています。例えば、4 コア CPU で負荷平均が 4.00 の場合、完全に使用されていることを示します。負荷平均が継続的に CPU コア数を超える場合、システムが過負荷であり、プロセスが CPU 時間を待っていることを示唆しています。

lscpu による CPU コアの確認

負荷平均を適切に解釈するには、システムが持つ論理 CPU コアの数を把握する必要があります。lscpu コマンドは、CPU アーキテクチャに関する詳細な情報を提供します。

lscpu コマンドを実行します。

lscpu

詳細な出力が表示されます。CPU(s): 行を探し、利用可能な論理 CPU の総数を把握します。また、Core(s) per socket:Socket(s): は物理的なレイアウトを理解するのに役立ちます。

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
...出力省略...

上記の例では、CPU(s): 4 は、このシステムが 4 つの論理 CPU コアを持っていることを示しています。

負荷平均と CPU コアの解釈

uptimelscpu の情報を組み合わせましょう。uptime の出力で負荷平均が 2.92, 4.48, 5.20 で、lscpu の出力で CPU(s): 4 となっている場合を考えます。

CPU あたりの負荷平均を得るには、各負荷平均の数値を論理 CPU の総数で割ります。

  • 過去 1 分間: 2.92 / 4 = 0.73
  • 過去 5 分間: 4.48 / 4 = 1.12
  • 過去 15 分間: 5.20 / 4 = 1.30

これらの計算に基づいて、

  • 過去 1 分間、CPU はその能力の約 73% 使用されていました。
  • 過去 5 分間、システムは負荷平均が 1.00 を超える分、約 12% 過負荷でした (1.12 - 1.00 = 0.12)。これは、プロセスが CPU 時間を待っていたことを意味します。
  • 過去 15 分間、システムは負荷平均が 1.00 を超える分、約 30% 過負荷でした (1.30 - 1.00 = 0.30)。

この分析は、過去 5 分間と 15 分間はシステムに大きな負荷がかかっていたものの、過去 1 分間では負荷が減少していることを示唆しています。このような傾向分析は、システムの状態を理解するために非常に重要です。

これらの 2 つのコマンド、uptimelscpu は、Linux システムの全体的な状態とパフォーマンスを迅速に評価するための、シンプルでありながら強力なツールです。

top コマンドによるプロセスアクティビティの分析

このステップでは、プロセスアクティビティを分析するために top コマンドの使い方を深く掘り下げます。top はリアルタイムでの概要を提供する一方で、プロセスをソート、フィルタリング、管理するための強力なインタラクティブ機能も備えています。

前のステップで、top がシステムの動的なビューを提供することを思い出してください。もう一度 top を起動します。

top

おなじみの top インターフェースが表示されます。上部セクションはシステム全体の統計情報を、下部セクションはプロセス一覧を表示します。

top のカラムの理解

プロセス一覧のデフォルトカラムを復習しましょう。

  • PID: プロセス ID。
  • USER: プロセスの所有者。
  • PR: プロセスの優先度。
  • NI: プロセスの Nice 値 (低い Nice 値は高い優先度)。
  • VIRT: プロセスが使用している仮想メモリ。
  • RES: プロセスが使用している常駐メモリ (物理 RAM)。
  • SHR: プロセスが使用している共有メモリ。
  • S: プロセス状態 (R=実行中,S=スリープ中,D=中断不可能なスリープ,T=停止中,Z=ゾンビ)。
  • %CPU: 最後の更新以降の CPU 使用率 (パーセント)。
  • %MEM: メモリ使用率 (RES / 全物理メモリ)。
  • TIME+: プロセスが開始されてからの総 CPU 時間。
  • COMMAND: プロセスを開始したコマンド名。

top のインタラクティブなキー操作

top は高度なインタラクティブ機能を持っています。様々なキーを押すことで表示内容を変更したり、プロセスと対話できます。

  1. プロセスのソート:

    • CPU 使用率 (%CPU) でプロセスをソートするには、Shift+P (大文字の P) を押します。これはデフォルトのソート方法です。
    • メモリ使用率 (%MEM) でプロセスをソートするには、Shift+M (大文字の M) を押します。
    • TIME+ でプロセスをソートするには、Shift+T (大文字の T) を押します。

    メモリ使用率でソートするために、今すぐ Shift+M を押してみてください。プロセス一覧がどのように並べ替えられるかを観察してください。その後、CPU 使用率でソートするために Shift+P を押します。

  2. ユーザーによるフィルタリング:

    • u (小文字の u) を押します。top はユーザー名を入力するよう促します。labex と入力して Enter キーを押します。
    • 今から、toplabex ユーザーが所有するプロセスのみを表示します。これは、自分のプロセスに焦点を当てるのに非常に便利です。
    • フィルタをクリアしてすべてのユーザーを表示するには、u を押してから、ユーザー名を入力せずに Enter キーを押します。
  3. 更新間隔の変更:

    • デフォルトでは、top は 3 秒ごとに更新されます。この間隔を変更できます。
    • s (小文字の s) を押します。top は遅延時間を入力するよう促します。1 (1 秒) と入力して Enter キーを押します。
    • 表示がより頻繁に更新される様子を観察してください。
    • s をもう一度押して 3 と入力することで、3 秒に戻すことができます。
  4. プロセスの終了:

    • top から直接プロセスを終了できます。
    • まず、新しいターミナルタブまたはウィンドウで、または現在のターミナルで Ctrl+Z を押して、top をバックグラウンドに移動し、bg を実行してから、sleep 600 & を実行し、fg を実行して top をフォアグラウンドに戻します。
    • 別の方法として、新しいターミナルタブ (例:多くのターミナルで Ctrl+Shift+T) を開き、そこで sleep 600 & を実行します。
    • sleep プロセスが実行されていることを確認したら、top ターミナルに戻ります。
    • k (小文字の k) を押します。top は終了するプロセスの PID を入力するよう促します。
    • top のリストで sleep 600 プロセスの PID を見つけます。その PID を入力して Enter キーを押します。
    • top は次に送信するシグナルを求めます。デフォルトは 15 (SIGTERM) です。Enter キーを押して SIGTERM を送信します。
    • sleep プロセスはリストから消えるはずです。消えない場合は、もう一度 k を押してシグナル 9 (SIGKILL) を送信してみてください。
  5. プロセスの優先度の変更 (Renice):

    • Renice はプロセスの優先度を変更します。低い Nice 値は高い優先度です。
    • r (小文字の r) を押します。top は PID と Nice 値 (例:より高い優先度のために -10、より低い優先度のために 10) を入力するよう促します。
    • これはシステムリソースを管理するための高度な機能です。この実験では、r を押してから Enter キーを 2 回押して、何も変更せずに操作をキャンセルします。
  6. top の終了:

    • 作業が完了したら、q (小文字の q) を押して top を終了し、ターミナルプロンプトに戻ります。

top はシステム管理者とユーザーにとって不可欠なツールです。そのインタラクティブ機能をマスターすることで、システムパフォーマンスの問題とプロセス管理を迅速かつ効果的に診断できます。

まとめ

この実験では、Linux プロセスの基本的な管理概念を学びました。pstop コマンドを使用して、プロセス状態とそのライフサイクルを理解し、プロセスが実行中 (R)、中断可能なスリープ (S)、停止 (T) などの状態間をどのように遷移するかを観察しました。一般的なプロセス状態を特定し、ps auxps -ef の出力からシステムプロセスに関する洞察を得る練習を行いました。

さらに、効率的なターミナル利用に不可欠な、バックグラウンドとフォアグラウンドジョブの制御方法を探求しました。また、killkillallpkill などの様々なコマンドを使用してプロセスを終了する方法を習得し、適切な終了や強制終了のためのそれぞれの適用方法を理解しました。最後に、uptimelscpu を使ってシステム負荷と CPU 使用率を監視し、top を使って詳細なプロセスアクティビティを分析することで、システムのパフォーマンスとリソース利用状況を包括的に把握する方法を学びました。