CLOVER🍀

That was when it all began.

Linuxで起動中のプロセスの情報(実行コマンドや起動引数、環境変数など)を確認する

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 … マッピングされているメモリ領域とその使用状況

こんなところでしょうか。いろいろわかるものですねぇ。

参考情報

procfs - Wikipedia

Linux Filesystem Hierarchy / /proc

Linux System Administrators Guide / The /proc filesystem

/proc/配下のディレクトリ

procファイルシステム配下のトップレベルファイル

bash - How do I split a "/proc/*/environ" file in separate lines? - Ask Ubuntu