proc/[pid]の中身を全部読んでみる ~ cwdからloginuidまで ~


概要

こちらに経緯をまとめていますのでご覧いただければ幸いです。
proc/[pid]の中身を全部読んでみる

間違っているよ、ここに詳しい情報が載っているよ、そのディレクトリもう使われていないよ、
など情報有ればコメントいただければ嬉しいです。

# sleep 365d > /dev/null &
[1] 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

# cd /proc/3792

cwd

# ll cwd
lrwxrwxrwx. 1 root root 0 Jan 11 13:12 cwd -> /root

プロセスのカレントディレクトリのシンボリックリンクです。
rootユーザーで実行したので/rootになっています。
3792プロセスは/rootで作業を行うそうです。危なそうですね。

environ

# cat environ
XDG_SESSION_ID=89SHELL=/bin/bashTERM=xtermHISTSIZE=1000USER=rootLS_COLORS=rs=0:di=01;34:ln=01;(省略)

# tr \\0 \\n < environ
XDG_SESSION_ID=89
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;(省略)
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/bin/sleep

環境変数の値です。null文字で区切られているようです。catだとわかりません。
ps ex | grep 3792でも同様の内容が確認できました。

追記

tr \\0 \\n < environとして\0(NULL)を\n(改行)に変換すると読みやすくなりました。

exe

# ll exe
lrwxrwxrwx. 1 root root 0 Jan 11 13:12 exe -> /usr/bin/sleep

実行ファイルのシンボリック

fd

# ll fd
total 0
lrwx------. 1 root root 64 Jan 11 12:49 0 -> /dev/pts/0 (deleted)
l-wx------. 1 root root 64 Jan 11 12:49 1 -> /dev/null
lrwx------. 1 root root 64 Jan 11 14:26 2 -> /dev/pts/0 (deleted)

プロセスがオープンしたファイル各々に対するエントリーを含むサブディレクトリ。 ファイルディスクリプターがファイル名で、 実際のファイルへのシンボリックリンクになっている。 したがって 0 は標準入力、1 は標準出力、2 は標準エラー出力、などとなる。 引用[https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html]

fd := File Descriptorの略だそうです。
これ便利ですね。入出力確認したいときに使えそう

fdinfo

# ll fdinfo/
total 0
-r--------. 1 root root 0 Jan 11 12:49 0
-r--------. 1 root root 0 Jan 11 12:49 1
-r--------. 1 root root 0 Jan 11 12:49 2

# cat fdinfo/0 fdinfo/1 fdinfo/2
pos:    0
flags:  0100002
mnt_id: 23
pos:    0
flags:  0100001
mnt_id: 20
pos:    0
flags:  0100002
mnt_id: 23

上記の情報があれば、プロセスがファイルディスクリプタを特定できるようです。

gid_map,uid_map

# cat gid_map
         0          0 4294967295
# cat uid_map
         0          0 4294967295

ユーザー名前空間内外で異なるUID,GIDを利用するために必要なマッピング情報を記述するようです。こちらが参考になりそうなので後で読みます。
https://gihyo.jp/admin/serial/01/linux_containers/0016

io

# cat io
rchar: 2012
wchar: 0
syscr: 7
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

このファイルは、 プロセスの I/O 統計情報を表示する。
...
rchar: 読み出し文字数
wchar: 書き込み文字数
syscr: 読み出しシステムコール数
syscw: 書き込みシステムコール数
read_bytes: 読み出しバイト数
write_bytes: 書き込みバイト数
cancelled_write_bytes:
...(一部略)
https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html

最後のは「書き込みに失敗したbyte数」なはず。

limits

# cat 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             2288                 2288                 processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       2288                 2288                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

プロセスのリソース制限についてまとめられています。

loginuid

# cat loginuid
1000

uid 1000って誰だろう

# cat /etc/passwd | grep 1000
inahy:x:1000:1001::/home/inahy:/bin/bash

sshログイン時の自分のuidでした。現状は[inahy]->[root]にsuしている状態です。
何に使うんでしょうか。

所感

体調悪くてコピペ作業になってしまいました。
のちに加筆修正したいと思います。

参考

http://man7.org/linux/man-pages/man5/proc.5.html
https://gihyo.jp/admin/serial/01/linux_containers/0016
http://manpages.ubuntu.com/manpages/bionic/ja/man5/proc.5.html