ただの技術メモ

個人備忘録

psコマンドと/proc

プロセスの状態を出力するコマンドとしてpsコマンドがある。

user-name:~$ ps aux | head -n 5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  1.5 169084  7752 ?        Ss    2021   6:40 /lib/systemd/systemd --system --deserialize 57
root           2  0.0  0.0      0     0 ?        S     2021   0:01 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<    2021   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<    2021   0:00 [rcu_par_gp]

このpsコマンドは/procディレクトリ(Ubuntu 20.04.2 LTSでのお話)にあるプロセスに関する詳細情報を表示している。

user-name:~$ ls /proc
1        1058115  1198997  1200722  17       1923203  1924214  202960   222650   2687863  4       498     69   730  81   90      983526     devices      iomem        kpagecount  mtrr          slabinfo       tty
10       1058173  1199055  1200878  1770802  1923446  1924240  203995   222651   28568    493837  499     70   738  83   91      acpi       diskstats    ioports      kpageflags  net           softirqs       uptime
101      1059267  1199056  13       179808   1923447  1925556  2047927  222652   28919    493920  500     71   74   84   983405  buddyinfo  dma          irq          loadavg     pagetypeinfo  stat           version
1029132  1059378  1199094  14       18       1923486  1925835  21       2269388  3        494054  501     714  745  845  983416  bus        driver       kallsyms     locks       partitions    swaps          version_signature
104      1059396  1199100  1424914  1882798  1923487  193      215      23       30187    494486  570584  717  75   85   983430  cgroups    execdomains  kcore        mdstat      pressure      sys            vmallocinfo
1048436  1059402  1199316  15       1882837  1923999  2        2183903  23799    30367    494509  570622  718  756  86   983452  cmdline    fb           key-users    meminfo     sched_debug   sysrq-trigger  vmstat
1055526  11       1199389  152      1882856  1924048  20       22       255      3059444  494729  6       72   76   87   983522  consoles   filesystems  keys         misc        schedstat     sysvipc        zoneinfo
1055528  117      1199409  154      19       1924068  202935   222644   256      3211724  494730  606513  725  77   88   983523  cpuinfo    fs           kmsg         modules     scsi          thread-self
1055529  1198994  12       16       1923161  1924167  202957   222646   2626495  3280889  497     664528  73   80   9    983524  crypto     interrupts   kpagecgroup  mounts      self          timer_list

/proc配下の数字が付いているディレクトリは実行中のプロセス番号と一致しており、これらのディレクトリはプロセスの生成によって作成されている。

/procは仮想的なファイルシステムの1つで各プロセスの詳細情報がファイルとして見られるように、カーネルが動的に作り出したファイルシステム

例えば、PIDが1925556のgoのserverプロセスのディレクトリにはさらに以下のようなファイルがある。

user-name:~$ sudo ls /proc/1925556
[sudo] password for hysrtr:
arch_status  auxv    cmdline      cpuset   exe     gid_map  loginuid   mem    mountstats  numa_maps  oom_score_adj  personality  sched  setgroups     stack  status   timers         wchan
attr         cgroup  comm         cwd      fd      io       map_files  mountinfo  net         oom_adj    pagemap    projid_map   schedstat  smaps         stat   syscall  timerslack_ns
autogroup    clear_refs  coredump_filter  environ  fdinfo  limits   maps       mounts     ns          oom_score  patch_state    root         sessionid  smaps_rollup  statm  task     uid_map

ディレクトリにプロセスに関する情報が含まれており、例えばcmdlineにはプロセスを開始したコマンドがフルパスで記述されている。

user-name:~$ sudo cat /proc/1925556/cmdline
goruncmd/main.go