はじめに
プロセス管理は、Linux システム管理の基本的な側面です。Linux で実行するすべてのプログラムやコマンドはプロセスを作成し、これらのプロセスを監視することは、システムのパフォーマンスを維持し、問題をトラブルシューティングするために不可欠です。
この実験では、Linux システム上で実行されているプロセスを監視および管理するための強力なツールである ps コマンドの使い方を習得する手順を案内します。ps コマンドとその様々なオプションの使い方を理解することで、いつでもシステムで何が起こっているかを詳しく把握することができます。
この実験を通じて、さまざまな形式でプロセスを表示する方法、すべてのシステムプロセスを表示する方法、および ps が各プロセスについて提供できる詳細情報を理解することができます。
基本的なプロセス情報の理解
Linux では、実行中のすべてのプログラムやコマンドはプロセスとして表されます。各プロセスには、プロセス ID (PID) と呼ばれる一意の識別子があります。ps コマンドを使用すると、これらのプロセスを表示し、それらに関する情報を取得することができます。
まずは、ps コマンドの基本的な使い方を探ってみましょう。
基本的な ps コマンド
LabEx 環境でターミナルを開きます。
~/projectディレクトリから始める必要があります。次のコマンドを入力し、Enter キーを押します。
ps
- 次のような出力が表示されます。
PID TTY TIME CMD
188 pts/0 00:00:00 zsh
449 pts/0 00:00:00 ps
この出力が何を意味するかを理解しましょう。
PID: プロセス ID。各プロセスに割り当てられる一意の番号TTY: ターミナルの種類。プロセスが実行されているターミナルを示しますTIME: プロセスが使用した CPU 時間CMD: プロセスを起動したコマンド
この例では、次のことがわかります。
zshシェルプロセス (現在のターミナルセッション)- 実行したばかりの
psコマンド
デフォルトの ps コマンドは、現在のターミナルセッションに関連付けられたプロセスのみを表示します。これは、最近実行したコマンドをすぐに確認するのに便利ですが、システムで何が起こっているかを完全に把握することはできません。
別のコマンドを実行してから、再度 ps を実行して、出力がどのように変化するかを確認してみましょう。
echo "Hello, world"
ps
echo コマンドがプロセスリストに表示されないことに気づくでしょう。これは、echo コマンドが非常に速く起動して終了し、ps コマンドを実行した時点ではもう実行されていなかったためです。
すべてのシステムプロセスの表示
前のステップでは、基本的な ps コマンドが現在のターミナルに関連するプロセスのみを表示することを学びました。しかし、一般的な Linux システムでは多くのプロセスが同時に実行されており、その多くは現在のターミナルセッションに直接関連していません。
システムで何が起こっているかをより完全に把握するには、ps コマンドに -e オプションを使用します。
ps -e を使用してすべてのプロセスを表示する
- ターミナルで次のコマンドを入力し、Enter キーを押します。
ps -e
- はるかに長いプロセスのリストが表示され、次のようなものになります。
PID TTY TIME CMD
1 ? 00:00:00 init.sh
22 ? 00:00:00 supervisord
23 ? 00:00:00 sshd
32 ? 00:00:00 dbus-daemon
35 ? 00:00:00 xfce4-session
···
この出力は、システム上で実行されているすべてのプロセスを表示しており、ターミナルに関連するものだけではありません。多くのプロセスの TTY 列に ? が表示されていることに注意してください。これは、これらのプロセスがどのターミナルにも関連付けられていないことを示しています。
システムプロセスの理解
表示されるプロセスの多くは、バックグラウンドで実行されているシステムサービスです。例えば:
init.sh(PID 1) は、システム起動時に最初に起動されるプロセスですsupervisordはプロセス制御システムですsshdは SSH サーバーデーモンですdbus-daemonは D-Bus メッセージバスデーモンですxfce4-sessionは Xfce デスクトップ環境の一部です
これらのプロセスは、さまざまなシステム機能を処理し、Linux システムを使いやすくするサービスを提供します。
プロセスの数をカウントする
現在システム上で実行されているプロセスの数を知りたい場合は、ps -e の出力を wc コマンドにパイプで渡すことができます。
ps -e | wc -l
表示される数字は、システム上で実行されているプロセスの総数に、ヘッダーの 1 行を加えたものを表しています。
詳細なプロセス情報の表示
これでシステム上で実行されているすべてのプロセスを表示できるようになったので、各プロセスに関するより詳細な情報を取得する方法を学んでみましょう。ps コマンドの -f オプションを使用すると、追加の詳細情報を含む「完全形式」のリストが提供されます。
詳細情報を得るための ps -ef の使用
- ターミナルで次のコマンドを入力し、Enter キーを押します。
ps -ef
- 次のような出力が表示されます。
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:45 ? 00:00:00 /bin/bash /etc/shiyanlou/sbin/init.sh
root 22 1 0 16:45 ? 00:00:00 /usr/bin/python3 /usr/bin/supervisord -n
root 23 22 0 16:45 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
labex 188 187 0 16:46 pts/0 00:00:00 -zsh
labex 677 188 0 16:55 pts/0 00:00:00 ps -ef
この形式では、各プロセスに関するはるかに詳細な情報が提供されます。
UID: プロセスの所有者のユーザー IDPID: プロセス IDPPID: 親プロセス ID (このプロセスを起動したプロセス)C: CPU 使用率STIME: プロセスの開始時間TTY: プロセスに関連付けられたターミナルTIME: プロセスが使用した CPU 時間CMD: 引数を含む完全なコマンド
プロセス間の関係の理解
PPID 列は、プロセス同士がどのように関連しているかを理解するのに特に役立ちます。すべてのプロセス (最初のプロセスを除く) は、別のプロセスによって起動され、親子関係が形成されます。
たとえば、上記の出力では:
- PID が 1 のプロセス (init.sh) の PPID は 0 です (最初のプロセスです)
- PID が 22 のプロセス (supervisord) の PPID は 1 です (init.sh によって起動されました)
- PID が 23 のプロセス (sshd) の PPID は 22 です (supervisord によって起動されました)
この階層関係によって「プロセスツリー」が形成され、pstree のような特殊なツールを使用して視覚化することができます (この実験では取り扱いません)。
プロセス情報のフィルタリング
ps と grep を組み合わせることで、特定のプロセスをフィルタリングすることができます。たとえば、zsh シェルに関連するすべてのプロセスを検索するには:
ps -ef | grep zsh
これにより、コマンド名に "zsh" が含まれるすべてのプロセスが表示されます。
システム上の他のプロセスを検索してみましょう。
ps -ef | grep bash
ps とフィルタリングツールのこの組み合わせにより、システムの監視やトラブルシューティングに強力なコマンドとなります。
プロセス情報のソートと高度なオプション
基本的なプロセス情報と詳細なリストについて学んだので、ps コマンドをさらに便利にするいくつかの追加オプションを探索してみましょう。
ps を使ったカスタムフォーマット
ps コマンドを使うと、自分が興味のある特定の情報を含むカスタム出力を作成できます。-o オプションを使うと、表示する列を指定できます。
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
このコマンドは以下の情報を表示します。
- プロセス ID (pid)
- 親プロセス ID (ppid)
- コマンド (cmd)
- CPU 使用率 (%) (%cpu)
- メモリ使用率 (%) (%mem)
--sort=-%cpu パラメータは、CPU 使用率の降順でプロセスをソートします (%cpu の前のマイナス記号は降順を示します)。
以下のような出力が表示されるはずです。
PID PPID CMD %CPU %MEM
789 788 ps -eo pid,ppid,cmd,%cpu,% 0.0 0.1
188 187 -zsh 0.0 0.1
35 34 xfce4-session 0.0 0.2
32 1 /usr/bin/dbus-daemon --sys 0.0 0.0
23 22 sshd: /usr/sbin/sshd -D [l 0.0 0.1
22 1 /usr/bin/python3 /usr/bin/ 0.0 0.2
1 0 /bin/bash /etc/shiyanlou/s 0.0 0.0
メモリを大量に消費するプロセスの特定
どのプロセスが最も多くのメモリを使用しているかを特定したい場合は、代わりにメモリ使用率でソートすることができます。
ps -eo pid,user,cmd,%mem --sort=-%mem | head -n 6
このコマンドは、PID、ユーザー、コマンド、およびメモリ使用率のパーセンテージを含む、メモリを最も多く消費する上位 5 つのプロセス (ヘッダー行を含む) を表示します。
プロセスの状態の理解
プロセスはさまざまな状態にあることができます。この情報を見てみましょう。
ps -eo pid,stat,cmd
STAT 列は、1 文字のコードを使ってプロセスの状態を表示します。
R: 実行中または実行可能S: 割り込み可能な待機状態で睡眠中D: 割り込み不可能な睡眠状態 (通常は入出力関連)Z: ゾンビプロセスT: 停止またはトレース中
ステータス文字の後に追加の文字が表示されることがあります。
<: 高優先度N: 低優先度s: セッションリーダー+: フォアグラウンドプロセスグループに属する
この情報は、任意の時点でプロセスが何をしているかを理解するのに役立ちます。
pstree を使った階層的な表示
pstree コマンドは ps コマンド自体の一部ではありませんが、プロセスの階層構造を視覚的に表現します。
pstree
これは、プロセス間の関係をツリー形式で表示し、プロセス同士がどのように関連しているかを理解しやすくします。
リアルタイムプロセス監視
ps コマンドは特定の時点でのプロセスのスナップショットを提供しますが、時にはプロセスを継続的に監視する必要があります。このステップでは、リアルタイムのプロセス監視ツールを探索します。
top コマンドの使用
top コマンドは、実行中のシステムの動的なリアルタイムビューを提供します。システムの概要情報と、Linux カーネルによって現在管理されているプロセスまたはスレッドのリストを表示します。
次のコマンドを実行します。
top
以下のような表示がされます。
top - 17:15:23 up 30 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 31 total, 1 running, 30 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1975.1 total, 1558.7 free, 180.4 used, 236.1 buff/cache
MiB Swap: 975.0 total, 975.0 free, 0.0 used. 1651.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 8988 3208 2556 S 0.0 0.2 0:00.07 init.sh
22 root 20 0 39528 8596 6088 S 0.0 0.4 0:00.20 supervisord
23 root 20 0 12128 6788 5864 S 0.0 0.3 0:00.00 sshd
...
出力は 2 つの部分に分かれています。
- システム概要 (上部 5 行)
- プロセスリスト (デフォルトでは CPU 使用率でソートされています)
top を終了するには、q キーを押します。
top の出力の理解
システム概要には以下の情報が表示されます。
- 稼働時間と負荷平均
- 状態別のタスク数 (実行中、睡眠中、停止中、ゾンビ)
- CPU 使用率の内訳
- メモリとスワップの使用状況
プロセスリストには以下の情報が表示されます。
- PID: プロセス ID
- USER: ユーザー所有者
- PR: 優先度
- NI: ナイス値
- VIRT: 使用されている仮想メモリ
- RES: 使用されている常駐メモリ
- SHR: 共有メモリ
- S: プロセスの状態
- %CPU: CPU 使用率
- %MEM: メモリ使用率
- TIME+: 使用された CPU 時間
- COMMAND: コマンド名
top での対話型コマンド
top が実行中の間、さまざまなキーボードコマンドを使用して対話することができます。
Mを押すと、メモリ使用率でソートされますPを押すと、CPU 使用率でソートされますkを押してから PID を入力すると、プロセスを終了できますhを押すと、ヘルプが表示されます
top を実行中に M を押して、メモリ使用率でソートされたプロセスを確認してみてください。
watch コマンドと ps の組み合わせ
リアルタイム監視の別の方法は、watch コマンドと ps を組み合わせることです。これにより、コマンドが定期的に実行され、出力が表示されるため、時間の経過に伴う変化を確認できます。
watch -n 1 'ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 6'
これは 1 秒ごとに更新され、CPU を最も多く消費する上位 5 つのプロセスを表示します。
watch を終了するには、Ctrl+C を押します。
ps と watch のようなユーティリティを組み合わせることで、システムのプロセスをリアルタイムで監視する強力な機能が得られます。
まとめ
この実験を通じて、ps コマンドと関連ツールを使用して Linux システムのプロセスを監視および管理するための重要なスキルを学びました。ここでは、学んだ内容を振り返ります。
基本的なプロセス情報:現在のターミナルセッションに関連付けられたプロセスを表示するために基本的な
psコマンドを使用する方法を学び、PID、TTY、TIME、および CMD を含む基本的な出力形式を理解しました。システム全体のプロセス表示:ターミナルに関連付けられたプロセスだけでなく、システム上で実行されているすべてのプロセスを表示するために
ps -eを使用する方法を習得しました。詳細なプロセス情報:ユーザー ID、親プロセス ID、開始時間、および完全なコマンドラインを含む、プロセスに関する詳細情報を取得するために
ps -efコマンドを探索しました。高度なソートとフォーマット:
ps -eoと--sortパラメータを使用して、特定の列とソートオプションを持つカスタム出力を作成する方法を発見しました。リアルタイム監視:動的なリアルタイムのプロセス表示に
topコマンドを使用する方法、および連続監視のためにpsをwatchなどの他のユーティリティと組み合わせる方法を学びました。
これらのスキルは、Linux 環境でのシステム管理、トラブルシューティング、およびパフォーマンス監視にとって基本的です。どのプロセスが実行されているか、およびそれらがシステムリソースをどのように消費しているかを理解することは、システムの健全性を維持し、問題を診断するために不可欠です。
Linux システムでの作業を続けるにつれて、プロセスを効果的に監視および管理する能力は、最も価値のあるスキルの 1 つになります。



