
目次
プロセスの管理
プロセスとは「実行中のプログラム」のことです。Linuxに限らずOSはたくさんのプログラムの集合体です。そのため、OSを単に起動するだけでも100個以上のプロセスが裏で動いています。加えてユーザが実行するプログラムもプロセスとして動作します。
OSはこれらのプロセスを管理するわけですが、プログラムの起動に際してプロセスID(PID)と呼ばれる識別子を付与して、プログラムの実行に必要な資源、つまり、CPUやメモリなどを割り当てます。

プログラムは割り振られたリソースの上でプロセスとして稼動し、役目を終えると終了してメモリなどの資源を開放する。サーバ関係のプロセスは「daemon(デーモン)」と呼ばれ、一度起動すると、通常は終了処理が行われない限り稼動し続けます。また、プロセスには“親と子”の関係があります。例えば、bashのプロンプトでpsコマンドを実行した場合、 “bashのプロセスが親”で“psのプロセスが子”になります。それぞれ「親プロセス」と「子プロセス」と表現します。
プロセスの監視(ps)
Linux上でどのようなプロセスが動作しているかは、psコマンドを用いて確認します。
書式:
ps [オプション] [PID] |
主なオプション:
-e | 全プロセスを表示する |
-f | 詳細情報を表示する |
-l | 長いフォーマットで詳細情報(NICE値を含む)を表示する |
-p PID | 指定されたPIDの情報を表示する |
a | 全プロセスを表示する |
u | 詳細情報を表示する |
x | 制御端末のないプロセス情報も表示する |
f | ツリー状で表示する |
psコマンドのオプションには、Solaris等で使用されるUnix形式とFreeBSDで使用されるBSD形式の2種類があります。Unix形式ではオプション文字にハイフンを付け、BSD形式ではハイフンを付けません。Linuxはどちらの指定も可能で、また混在することもできます
<実習:psコマンドの実行>
Unix形式で全てのプロセスを表示する場合は「-ef」、BSD形式では「aux」オプションを使います。
表示内容には多少違いがあります。なお実行はrootで行って下さい。
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 6月12 ? 00:00:08 /usr/lib/systemd/systemd --syste
root 2 0 0 6月12 ? 00:00:00 [kthreadd]
root 4 2 0 6月12 ? 00:00:00 [kworker/0:0H]
root 6 2 0 6月12 ? 00:00:04 [ksoftirqd/0]
root 7 2 0 6月12 ? 00:00:00 [migration/0]
root 8 2 0 6月12 ? 00:00:00 [rcu_bh]
(以下省略)
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 46212 6628 ? Ss 6月12 0:08 /usr/lib/syst
root 2 0.0 0.0 0 0 ? S 6月12 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 6月12 0:00 [kworker/0:0H
root 6 0.0 0.0 0 0 ? S 6月12 0:04 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 6月12 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 6月12 0:00 [rcu_bh]
(以下省略)
<実習:psコマンドのツリー表示>
# ps -l af
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 13201 13200 0 80 0 - 28917 do_wai pts/0 0:00 -bash
4 S 0 14622 13201 0 80 0 - 48000 do_wai pts/0 0:00 \_ su -
4 S 0 14626 14622 0 80 0 - 28886 do_wai pts/0 0:00 \_ -bash
0 R 0 15391 14626 0 80 0 - 38336 - pts/0 0:00 \_ ps -l af
「ps -l af」コマンドを実行した結果です。この結果は、一般ユーザ(1000)権限でログイン(3行目)し、suコマンドを使ってroot権限を取得(4行目)し、rootユーザのbash(5行目)でpsコマンドを実行(6行目)した結果です。
なお、PPIDが子プロセスのIDです。1行目の子プロセスが2行目、2行目の子プロセスが3行目と段々になっていることがわかります。
プロセスのツリー表示(pstree)
「f」オプションを用いたpsコマンドは、親プロセスと子プロセスを階層構造で表示しますが、pstreeコマンドを用いても確認することができます。
書式:
pstree [オプション] |
主なオプション:
-p | プロセスIDを表示する |
<実習:pstreeコマンドの実行>
# pstree
systemd┬NetworkManager┬dhclient
│ └2* [{NetworkManager}]
├agetty
├auditd─{auditd}
├chronyd
├crond
├dbus-daemon─{dbus-daemon}
├firewalld─{firewalld}
├master┬cleanup
│ ├local
│ ├pickup
│ ├qmgr
│ └trivial-rewrite
(以下省略)
上記のようにpstreeコマンドを用いることで、プロセスをツリー表示させることができます。これにより親子関係をわかりやすく表示することができます。
なお、「-p」オプションを用いるとプロセスIDをツリー上に表示させることも可能です。
# pstree -p
systemd(1)┬NetworkManager(693)┬dhclient(821)
│ ├{NetworkManager}(707)
│ └{NetworkManager}(710)
├agetty(690)
├auditd(624)─{auditd}(625)
├chronyd(674)
├crond(672)
├dbus-daemon(649)─{dbus-daemon}(653)
├firewalld(689)─{firewalld}(818)
├master(1258)┬cleanup(20505)
│ ├local(20507)
│ ├pickup(20840)
│ ├qmgr(1260)
│ └trivial-rewrite(20842)
(以下省略)
メモリの管理(free)
freeコマンドはメモリの利用状況を確認するコマンドです。一般ユーザでも利用できるコマンドで、引数なしで実行することができます。デフォルト表示単位はKBです。
書式:
free [オプション] |
主なオプション:
-b | 表示単位をB(byte)で表示する |
-k | 表示単位をKBで表示する |
-m | 表示単位をMBで表示する |
-g | 表示単位をGBで表示する |
-h | 読みやすい単位で表示する |
freeコマンドのオプションは、ほとんどが単位を表示するものですので、自分の読みやすいオプションを使いましょう。なお省略した場合の単位はKBです。
<実習:freeコマンドの実行>
# free
total used free shared buff/cache available
Mem: 1014764 200280 231700 13260 582784 634132
Swap: 839676 264 839412
「total」は物理メモリ全体の容量、「used」は現在使用しているメモリ容量、「free」は何にも使用されていない空きメモリ容量です。
特に何も使用していないにも関わらず、使用しているメモリ(used)の割に、空きメモリ(free)の容量が少ないことに違和感を感じるかも知れませんが、これはLinuxの仕様によるものです。システムが「buff/cache」として確保しているためにこの様な表示になっているもので、異常なわけではありません。
Linuxのメモリ使用率を確認すると、最初から高いように感じるかもしれませんが、それは上記のような理由によるものです。
ちなみに、sharedはtmpfs用のメモリで、メモリ内に作成する一時的記憶領域です。
リソースのリアルタイムモニタ(top)
これまでに紹介した様々コマンドを使用することでシステムの状態を調査することができます。しかし、いずれのコマンドも実行したその瞬間の状況しか表示することができません。
実際にサーバが正常に動作しない等の状況によっては、リアルタイムに移り変わる状況を観察しなければならないケースがあります。もちろん、psやfreeコマンドを定期的に実行する、という方法でも構いませんが、長時間になると非現実的です。
このような、リアルタイムにモニタリングしたい場合はtopコマンドを使用します。
書式:
top [オプション] |
主なオプション:
-d 間隔 | 更新する間隔を「ss.tt秒」で指定する |
-n 回数 | 表示を繰り返す回数を指定する |
-U(-u) ユーザ | 指定したユーザを監視する。ユーザはユーザ名またはIDどちらでもよい |
-p PID | 指定したプロセスIDを監視する |
<実習:topコマンドの実行>
# top
top - 02:16:22 up 4 days, 15:04, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 97 total, 1 running, 96 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1014764 total, 230820 free, 200772 used, 583172 buff/cache
KiB Swap: 839676 total, 839412 free, 264 used. 633616 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15692 root 20 0 161992 2164 1544 R 0.7 0.2 0:00.12 top
1 root 20 0 128140 6680 4044 S 0.0 0.7 0:09.26 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
:
topコマンドは、CPU使用率や負荷率、メモリ使用状況に加えて現在実行中のプロセスをリアルタイムに表示され、デフォルトでは5秒おきに更新されます。終了したい時は「q」キーを押します。
ちなみに、2行目はuptimeコマンド、5~6行目はfreeコマンド、8行目以下はpsコマンドと同じものが表示されます。
ロードアベレージ
簡単に説明すると、システムの負荷状態を示す指数です。0が最も小さく、数値が大きいほどシステムに負荷がかかっていることを示します。
もう少し具体的に言うと、この数値は処理順番待ちのプロセス数の平均値が表示されています。つまり、この数値が大きければ大きいほど、処理の順番待ちをしているプロセスが多い、ということを意味し、システムがプロセスを処理しきれていない状態であることを意味します。
ロードアベレージには3つの数値がありますが、左から1分平均、5分平均、15分平均となっています。