プロセス

プログラムの実行単位。
コマンドやデーモンを実行するとそれぞれがプロセスになる。
実行しているプロセスには一意の識別子(PID)が割り当てられる。特にカーネル起動後最初に起動されるinitプロセスのPIDは1になる。
プロセスはすべて親子関係を持っており、最初に起動したinitの子プロセス、孫プロセス、ひ孫プロセス...になる。
子プロセスを終了する前に親プロセスが終了した場合はその子プロセスは孤児となりinitプロセスの養子として引き取られる。

プロセス情報の調べ方

psコマンド

現在実行中のプロセスの一覧を表示する。
プロセスID(PID)やプロセスを起動したコマンド(CMD)などの情報を見ることができる。
オプションによって表示情報を増やしたり書式を指定することが可能。
詳細はman ps(1) 等を参照。

$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 22:11 ? 00:00:04 /sbin/init auto noprompt root 2 0 0 22:11 ? 00:00:00 [kthreadd] root 4 2 0 22:11 ? 00:00:00 [kworker/0:0H] root 6 2 0 22:11 ? 00:00:00 [mm_percpu_wq] root 7 2 0 22:11 ? 00:00:00 [ksoftirqd/0] root 8 2 0 22:11 ? 00:00:01 [rcu_sched] root 9 2 0 22:11 ? 00:00:00 [rcu_bh] root 10 2 0 22:11 ? 00:00:00 [migration/0] root 11 2 0 22:11 ? 00:00:00 [watchdog/0] root 12 2 0 22:11 ? 00:00:00 [cpuhp/0] root 13 2 0 22:11 ? 00:00:00 [cpuhp/1] root 14 2 0 22:11 ? 00:00:00 [watchdog/1] root 15 2 0 22:11 ? 00:00:00 [migration/1] root 16 2 0 22:11 ? 00:00:00 [ksoftirqd/1] root 18 2 0 22:11 ? 00:00:00 [kworker/1:0H] root 19 2 0 22:11 ? 00:00:00 [cpuhp/2] root 20 2 0 22:11 ? 00:00:00 [watchdog/2] root 21 2 0 22:11 ? 00:00:00 [migration/2] root 22 2 0 22:11 ? 00:00:00 [ksoftirqd/2] root 24 2 0 22:11 ? 00:00:00 [kworker/2:0H] root 25 2 0 22:11 ? 00:00:00 [cpuhp/3] root 26 2 0 22:11 ? 00:00:00 [watchdog/3] root 27 2 0 22:11 ? 00:00:00 [migration/3] root 28 2 0 22:11 ? 00:00:00 [ksoftirqd/3] root 30 2 0 22:11 ? 00:00:00 [kworker/3:0H] root 31 2 0 22:11 ? 00:00:00 [cpuhp/4] root 32 2 0 22:11 ? 00:00:00 [watchdog/4] root 33 2 0 22:11 ? 00:00:00 [migration/4]

topコマンド

プロセスの状態をリアルタイムに表示する。
システム全体のCPU使用状況、メモリ使用状況、プロセス毎のCPU使用状況、メモリ使用状況などの情報を見ることができる。

コマンドの実行。

$ top

topコマンドを実行すると以下のような画面が表示され内容が定期的に更新される。
更新間隔デフォルト3秒だが-dオプションで指定することが可能。
詳細はman top(1) 等を参照。

top - 22:43:07 up 31 min, 1 user, load average: 0.11, 0.24, 0.44 Tasks: 300 total, 1 running, 299 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.4 us, 3.0 sy, 0.0 ni, 94.5 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem : 5048128 total, 738852 free, 2258780 used, 2050496 buff/cache KiB Swap: 1942896 total, 1942896 free, 0 used. 2795496 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2664 zil 20 0 3864912 212840 90972 S 11.2 4.2 1:50.60 gnome-shell 19364 zil 20 0 2414204 403548 142840 S 8.9 8.0 2:51.23 firefox 19444 zil 20 0 2464704 514856 134524 S 7.9 10.2 2:57.71 Web Content 19335 zil 20 0 813640 46640 36196 S 3.6 0.9 0:16.25 gnome-terminal- 2671 zil 20 0 801084 87212 62676 S 3.0 1.7 0:47.44 Xwayland 2724 zil 20 0 371508 10976 8676 S 2.6 0.2 0:10.15 ibus-daemon 19859 zil 20 0 47520 4340 3580 R 1.3 0.1 0:00.28 top 4260 zil 20 0 380968 11848 10300 S 0.7 0.2 0:04.33 ibus-engine-moz 662 root 20 0 38596 3456 3056 S 0.3 0.1 0:00.24 irqbalance 4389 zil 20 0 879704 99180 29308 S 0.3 2.0 0:02.15 gnome-software 4423 zil 20 0 962064 100940 54548 S 0.3 2.0 0:02.26 nautilus-deskto 19562 zil 20 0 191224 24088 20964 S 0.3 0.5 0:02.36 mozc_renderer 19655 zil 20 0 2052812 154816 100148 S 0.3 3.1 0:07.94 Web Content 1 root 20 0 220180 8504 6400 S 0.0 0.2 0:05.02 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0 8 root 20 0 0 0 0 S 0.0 0.0 0:02.11 rcu_sched 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0 11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 14 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 15 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/1 16 root 20 0 0 0 0 S 0.0 0.0 0:00.39 ksoftirqd/1 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/2 20 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/2 21 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/2 22 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/2 24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/2:0H 25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/3

procファイルシステム

procファイルシステムはカーネルが提供する情報にアクセスするための疑似ファイルシステム。
/proc にマウントされており、ここに存在するファイルは通常のファイルと同様に読むことができる。

/proc 以下をlsコマンドで表示すると数字のディレクトリが多数存在していることがわかる。ここには現在実行しているプロセスの情報が格納されており、数字はpsコマンドやtopコマンドで表示されるPIDに対応している。

$ ls /proc 1 1303 1455 19562 217 239 257 2693 32 369 4356 51 664 881 irq scsi 10 1312 1460 19610 218 24 2575 27 322 3694 4367 52 665 9 kallsyms self 10965 1357 1462 19655 219 240 2579 2723 323 3696 4382 53 67 941 kcore slabinfo 10966 1362 1467 19692 22 241 258 2724 3243 3698 4385 54 673 acpi key-users softirqs 10975 1364 1468 19765 220 242 2581 2728 33 37 4386 55 68 asound keys stat (以下省略)

例えばfirefoxプロセスのPID 19364 の中身は以下のようになっている。

$ ls /proc/19364 attr cmdline environ io mem ns pagemap sched stack task autogroup comm exe limits mountinfo numa_maps patch_state schedstat stat timers auxv coredump_filter fd loginuid mounts oom_adj personality sessionid statm timerslack_ns cgroup cpuset fdinfo map_files mountstats oom_score projid_map setgroups status uid_map clear_refs cwd gid_map maps net oom_score_adj root smaps syscall wchan

cmdlineにはプロセスを起動した際のコマンドが格納されておりcatコマンドで表示すると以下のようになる。

$ cat /proc/19364/cmdline /usr/lib/firefox/firefox-new-window

statusにはプロセスのメモリ使用状況やその他プロセスに関する様々な情報が読みやすいように整形されて格納されておりcatコマンドで表示させると以下のような情報が得られる。

$ cat /proc/19364/status Name: firefox Umask: 0002 State: S (sleeping) Tgid: 19364 Ngid: 0 Pid: 19364 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 512 Groups: 4 24 27 30 46 118 128 1000 NStgid: 19364 NSpid: 19364 NSpgid: 2579 NSsid: 2579 VmPeak: 2517280 kB VmSize: 2458096 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 462672 kB VmRSS: 423516 kB RssAnon: 275604 kB RssFile: 116068 kB RssShmem: 31844 kB VmData: 746196 kB VmStk: 132 kB VmExe: 176 kB VmLib: 170256 kB VmPTE: 2100 kB VmPMD: 24 kB VmSwap: 0 kB HugetlbPages: 0 kB Threads: 61 SigQ: 0/19507 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000001001000 SigCgt: 0000000f820044ff CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000003fffffffff CapAmb: 0000000000000000 NoNewPrivs: 0 Seccomp: 0 Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff Cpus_allowed_list: 0-127 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 344540 nonvoluntary_ctxt_switches: 38024

taskディレクトリにはそのプロセスが実行しているスレッドの情報が格納されている。
複数のスレッドを実行しているプロセスの場合はtask以下に複数のディレクトリが存在することになる。
task以下のディクレクトリの番号はスレッドのID(tid)に対応する。
tidのディレクトリの構成はほぼPIDのディレクトリと同じような構成になっている。

$ ls /proc/19364/task/19371/ attr clear_refs cwd fdinfo loginuid mounts oom_adj patch_state sched smaps status auxv cmdline environ gid_map maps net oom_score personality schedstat stack syscall cgroup comm exe io mem ns oom_score_adj projid_map sessionid stat uid_map children cpuset fd limits mountinfo numa_maps pagemap root setgroups statm wchan

他にも様々な情報が得られるが詳細はman proc(5) 等を参照。