procファイルシステムの話。今まで部分的にしか見てこなかったので、もうちょっと見てみようかなと。
「/proc/[PID]」配下のディレクトリを調べると、プロセスに関する情報がいろいろと並んでいます。
例えば、WildFlyをダウンロードして起動してみます。
$ wget https://download.jboss.org/wildfly/15.0.0.Final/wildfly-15.0.0.Final.tar.gz $ tar xf wildfly-15.0.0.Final.tar.gz $ cd wildfly-15.0.0.Final $ bin/standalone.sh
このプロセスの情報を見てみましょう。
「/proc/[PID]」配下を見てみる
これだけずらっと並びます。
$ ls -l /proc/[PID] 合計 0 dr-xr-xr-x 2 xxxxx xxxxx 0 1月 2 19:48 attr -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 autogroup -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 auxv -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:47 cgroup --w------- 1 xxxxx xxxxx 0 1月 2 19:48 clear_refs -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 cmdline -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 comm -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 coredump_filter -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 cpuset lrwxrwxrwx 1 xxxxx xxxxx 0 1月 2 19:48 cwd -> /path/to/wildfly-15.0.0.Final -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 environ lrwxrwxrwx 1 xxxxx xxxxx 0 1月 2 19:47 exe -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java dr-x------ 2 xxxxx xxxxx 0 1月 2 19:48 fd dr-x------ 2 xxxxx xxxxx 0 1月 2 19:48 fdinfo -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 gid_map -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 io -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 limits -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 loginuid dr-x------ 2 xxxxx xxxxx 0 1月 2 19:48 map_files -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:47 maps -rw------- 1 xxxxx xxxxx 0 1月 2 19:48 mem -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:47 mountinfo -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 mounts -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 mountstats dr-xr-xr-x 5 xxxxx xxxxx 0 1月 2 19:47 net dr-x--x--x 2 xxxxx xxxxx 0 1月 2 19:48 ns -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 numa_maps -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 oom_adj -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 oom_score -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 oom_score_adj -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 pagemap -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 patch_state -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 personality -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 projid_map lrwxrwxrwx 1 xxxxx xxxxx 0 1月 2 19:48 root -> / -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 sched -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 schedstat -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 sessionid -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 setgroups -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 smaps -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 smaps_rollup -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 stack -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 stat -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 statm -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:47 status -r-------- 1 xxxxx xxxxx 0 1月 2 19:48 syscall dr-xr-xr-x 66 xxxxx xxxxx 0 1月 2 19:48 task -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 timers -rw-rw-rw- 1 xxxxx xxxxx 0 1月 2 19:48 timerslack_ns -rw-r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 uid_map -r--r--r-- 1 xxxxx xxxxx 0 1月 2 19:48 wchan
プロセスの実行コマンドを確認する
「/proc/[PID]/exe」で確認することができます。
$ ls -l /proc/[PID]/exe lrwxrwxrwx 1 xxxxx xxxxx 0 1月 2 19:47 /proc/15824/exe -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
プロセスのカレントディレクトリを確認する
「/proc/[PID]/cwd」で確認することができます。
$ ls -l /proc/[PID]/cwd lrwxrwxrwx 1 xxxxx xxxxx 0 1月 2 19:48 /proc/15824/cwd -> /path/to/wildfly-15.0.0.Final
プロセスの起動引数を確認する
「/proc/[PID]/cmdline 」で、プロセスの起動引数を確認することができます。
$ cat /proc/[PID]/cmdline /usr/lib/jvm/java-8-openjdk-amd64/bin/java-D[Standalone]-server-Xms64m-Xmx512m-XX:MetaspaceSize=96M-XX:MaxMetaspaceSize=256m-Djava.net.preferIPv4Stack=true-Djboss.modules.system.pkgs=org.jboss.byteman-Djava.awt.headless=true-Dorg.jboss.boot.log.file=/path/to/wildfly-15.0.0.Final/standalone/log/server.log-Dlogging.configuration=file:/path/to/wildfly-15.0.0.Final/standalone/configuration/logging.properties-jar/path/to/wildfly-15.0.0.Final/jboss-modules.jar-mp/path/to/wildfly-15.0.0.Final/modulesorg.jboss.as.standalone-Djboss.home.dir=/path/to/wildfly-15.0.0.Final-Djboss.server.base.dir=/path/to/wildfly-15.0.0.Final/standalone
ですが、これだと見づらい(NULLが区切りになっているため)ので、xargsコマンドを介して見るとよいでしょう。
$ xargs -0 -L1 -a /proc/[PID]/cmdline /usr/lib/jvm/java-8-openjdk-amd64/bin/java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/path/to/wildfly-15.0.0.Final/standalone/log/server.log -Dlogging.configuration=file:/path/to/wildfly-15.0.0.Final/standalone/configuration/logging.properties -jar /path/to/wildfly-15.0.0.Final/jboss-modules.jar -mp /path/to/wildfly-15.0.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/path/to/wildfly-15.0.0.Final -Djboss.server.base.dir=/path/to/wildfly-15.0.0.Final/standalone
Perl One Linerで置換してもよいかも…。
$ perl -wp -e 's!\0!\n!g' /proc/[PID]/cmdline /usr/lib/jvm/java-8-openjdk-amd64/bin/java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/path/to/wildfly-15.0.0.Final/standalone/log/server.log -Dlogging.configuration=file:/path/to/wildfly-15.0.0.Final/standalone/configuration/logging.properties -jar /path/to/wildfly-15.0.0.Final/jboss-modules.jar -mp /path/to/wildfly-15.0.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/path/to/wildfly-15.0.0.Final -Djboss.server.base.dir=/path/to/wildfly-15.0.0.Final/standalone
よくよく見ると、stringsの方は一部情報が欠けている…。
プロセスの環境変数を確認する
「/proc/[PID]/environ」で、確認することができます。「cmdline」と同様、区切り文字がNULLになっていてcatなどだと
見づらいので、xargsか
$ xargs -0 -L1 -a /proc/[PID]/environ
NULL文字を置換して見るとよいでしょう。
$ perl -wp -e 's!\0!\n!g' /proc/[PID]/environ
プロセスの統計情報を確認する
「/proc/[PID]/stat」で確認します。
$ cat /proc/15824/stat 15824 (java) S 15779 15779 16476 34822 15779 1077936128 99846 0 0 0 1352 64 0 0 20 0 64 0 2802279 2325237760 97426 18446744073709551615 94907598200832 94907598203328 140724476552832 0 0 0 0 0 16800975 0 0 0 17 3 0 0 0 0 0 94907600301400 94907600302096 94907627917312 140724476554347 140724476555171 140724476555171 140724476559309 0
また、「/proc/[PID]/statm」ではメモリの関する情報を確認することができます。
$ cat /proc/[PID]/statm 567685 101396 7048 1 0 158617 0
が、これだと読みにくいので「/proc/[PID]/status」で見るのがよいでしょう。
$ cat /proc/[PID]/status Name: java Umask: 0002 State: S (sleeping) Tgid: 15824 Ngid: 0 Pid: 15824 PPid: 15779 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 512 Groups: 4 24 27 30 46 116 126 129 998 1000 NStgid: 15824 NSpid: 15824 NSpgid: 15779 NSsid: 16476 VmPeak: 2305572 kB VmSize: 2270740 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 392820 kB VmRSS: 389704 kB RssAnon: 361516 kB RssFile: 28188 kB RssShmem: 0 kB VmData: 634140 kB VmStk: 136 kB VmExe: 4 kB VmLib: 19432 kB VmPTE: 1288 kB VmSwap: 0 kB HugetlbPages: 0 kB CoreDumping: 0 Threads: 64 SigQ: 0/63222 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 2000000181005ccf CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000003fffffffff CapAmb: 0000000000000000 NoNewPrivs: 0 Seccomp: 0 Speculation_Store_Bypass: thread vulnerable Cpus_allowed: ff Cpus_allowed_list: 0-7 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: 1 nonvoluntary_ctxt_switches: 0
プロセスが開いているファイルを確認する
正確には、File Descriptor、ですが。
「/proc/[PID]/fd」ディレクトリ配下を参照しましょう。
$ ls -l /proc/[PID]/fd 合計 0 lrwx------ 1 xxxxx xxxxx 64 1月 2 20:08 0 -> /dev/pts/6 lrwx------ 1 xxxxx xxxxx 64 1月 2 20:08 1 -> /dev/pts/6 lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 10 -> /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/localedata.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 100 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/javax/enterprise/concurrent/api/main/jboss-concurrency-api_1.0_spec-1.0.2.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 101 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/io/reactivex/rxjava2/rxjava/main/rxjava-2.2.2.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 102 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/javax/interceptor/api/main/jboss-interceptors-api_1.2_spec-1.0.1.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 103 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/jboss/as/naming/main/wildfly-naming-15.0.0.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 104 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/jboss/jboss-transaction-spi/main/jboss-transaction-spi-7.6.0.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 105 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/hibernate/validator/main/hibernate-validator-6.0.13.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 106 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/glassfish/javax/enterprise/concurrent/main/javax.enterprise.concurrent-1.0.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 107 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/wildfly/http-client/ejb/main/wildfly-http-ejb-client-1.0.12.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 108 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/javax/ejb/api/main/jboss-ejb-api_3.2_spec-1.0.1.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 109 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/org/jboss/security/negotiation/main/jboss-negotiation-common-3.0.4.Final.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 11 -> /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunpkcs11.jar lr-x------ 1 xxxxx xxxxx 64 1月 2 20:08 110 -> /path/to/wildfly-15.0.0.Final/modules/system/layers/base/net/jcip/main/jcip-annotations-1.0.jar 〜省略〜
プロセスに適用されている、リソース制限を確認する
いわゆる、limitsです。「/proc/[PID]/limits」で確認します。
$ cat /proc/[PID]/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 63222 63222 processes Max open files 1048576 1048576 files Max locked memory 16777216 16777216 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 63222 63222 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
スレッドに関する情報を見る
「/proc/[PID]/task/[ThreadID]」配下に、「/proc/[PID]」と同じ構造のディレクトリ構成が並んでいます。
lsで見るとaskディレクトリ配下にスレッドのIDがずらっと並んでいるので、一覧を見て、さらにその中身を
見てみるとよいでしょう。
$ ls -l /proc/[PID]/task
その他
- /proc/[PID]/maps … マッピングされているメモリ情報
- /proc/[PID]sched … CPUスケジューラ統計
- /proc/[PID]/schedstat … CPUの実行時間、レイテンシ、タイムスライス
- /proc/[PID]/smaps … マッピングされているメモリ領域とその使用状況
こんなところでしょうか。いろいろわかるものですねぇ。
参考情報
Linux Filesystem Hierarchy / /proc
Linux System Administrators Guide / The /proc filesystem
bash - How do I split a "/proc/*/environ" file in separate lines? - Ask Ubuntu