proc/[pid]の中身を全部読んでみる


初めに

自信ないのでコメントご指摘いただけると嬉しいです。

環境

  • GCP
  • CentOS 7.7

背景

プロセスのことよく知らないので、とりあえずプロセス配下のファイルを全部開いてみれば
少しでもお近づきになれるかと思い、やってみました

環境の確認

GCPで立てたサーバにsshし、rootログインしました。とりあえずCentOSのバージョンの確認。

# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

現在の/procディレクトリの中身(-vは並べ替えオプション)

# ls /proc/ -v
1   20  98   182  835   2198       diskstats    kpagecount    self
2   21  140  243  852   3082       dma          kpageflags    slabinfo
4   22  142  276  853   3250       driver       loadavg       softirqs
6   23  143  282  854   3254       execdomains  locks         stat
7   24  147  333  949   3389       fb           mdstat        swaps
8   30  171  376  950   3475       filesystems  meminfo       sys
9   31  172  378  951   3494       fs           misc          sysrq-trigger
10  32  173  379  955   acpi       interrupts   modules       sysvipc
11  33  174  384  965   buddyinfo  iomem        mounts        timer_list
13  41  175  398  969   bus        ioports      mtrr          timer_stats
14  42  176  427  970   cgroups    irq          net           tty
15  43  177  431  1160  cmdline    kallsyms     pagetypeinfo  uptime
16  44  178  434  1162  consoles   kcore        partitions    version
17  45  179  435  2128  cpuinfo    keys         schedstat     vmallocinfo
18  47  180  459  2131  crypto     key-users    sched_debug   vmstat
19  60  181  612  2132  devices    kmsg         scsi          zoneinfo

いっぱい並んでいます。
数字のディレクトリはそれぞれ実行中のプロセスの情報が入っているようです。
(例えば、「1」というディレクトリにはPIDが1のプロセスの情報)
それ以外のディレクトリは、プロセス全体で共有する情報とかが入っているんだと思います。
cpuinfoやmeminfoでcpuやメモリの情報が確認できます。
実行中のプロセス一覧も開いてみました

# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:06 /usr/lib/systemd/systemd --switched-root --system --dese
    2 ?        S      0:00 [kthreadd]
    4 ?        S<     0:00 [kworker/0:0H]
    6 ?        S      0:00 [ksoftirqd/0]
    7 ?        S      0:00 [migration/0]
    8 ?        S      0:00 [rcu_bh]
    9 ?        R      0:01 [rcu_sched]
   10 ?        S<     0:00 [lru-add-drain]
   11 ?        S      0:01 [watchdog/0]
   13 ?        S      0:00 [kdevtmpfs]
   14 ?        S<     0:00 [netns]
   15 ?        S      0:00 [khungtaskd]
    ...

若干の差異はありましたが、上記のプロセスIDの数だけプロセスが稼働していました。
確認は以上として、まずは実行プロセスを一つ追加して、そのプロセスの情報を確認してみたいと思います。

なにもしないプロセスを実行

# sleep 365d > /dev/null &
[1] 3792

バックグラウンドで365日待機するプロセスです。[参考]http://www.usupi.org/sysad/024.html
これって/dev/nullに吐き出す意味があるんでしょうか。
sleep 365d &だけだとどこかにログを吐いてしまう的な?どこでしょうか。
それは置いておいて、3792と返事を返してくれたので、今回はプロセスIDが3792で作成してくれたようです。psコマンドで確認してみます。

# ps aux | grep 3792
root      3792  0.0  0.0 107956   352 pts/0    S    06:28   0:00 sleep 365d
root      3881  0.0  0.1 112712   960 pts/0    S+   06:37   0:00 grep --color=auto 3792

実行中になっていますね。2つある理由は、現在検索したgrep 3792コマンドもマッチしているからです。
さて、このプロセスのディレクトリを見てみます。

ls /proc/3792

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

量が多く、記事が長くなりそうなため、一列ごとに記事を分けたいと思います。
また、以降の記事では/proc/3792をカレントディレクトリとします。

#cd /proc/3792