プロセスの環境変数を確認する方法が複数あるのでまとめる。
strings
確認したいプロセスのプロセスIDがわかっているときは、バイナリファイルやデータファイルでも表示可能な文字列を表示できるstrings
を使うのが一番簡潔。
環境変数は/proc/[PID]/environ
に記載されているが、各環境変数はnull文字(\0
)で区切られているため、単純にcatするだけでは一行で出力されてしまい見づらい。
$ sudo cat /proc/4186/environ
TERM=xtermTMPDIR=/dev/shmPATH=/sbin:/usr/sbin:/bin:/usr/binPWD=/LANG=CSHLVL=2_=/usr/sbin/httpd
stringsを使うとnull文字で区切って表示してくれる。
$ sudo strings /proc/4186/environ
TERM=xterm
TMPDIR=/dev/shm
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
LANG=C
SHLVL=2
_=/usr/sbin/httpd
ps eオプション
確認したいプロセスのプロセスIDがまだわかっていないとき、プロセスIDを調べるためにpsコマンドを打つとすると、合わせてe
オプションを指定すると環境変数が表示される。ただし、/proc/[pid]/environが自ユーザで起動しているプロセスのものでなければ、rootユーザでないと開けないのと同様に、rootでpsを行うか、sudoしないとe
オプションをつけても環境変数が表示されない。
よく使うオプションの組み合わせとしてps aux
があるが、これに加えてps auxe
が見やすい。
以下の例はヘッダと先ほどから使っているプロセスID4186のみを表示するため、パイプ以降が複雑になっているが、パイプ以前のコマンドのみでも起動プロセス数が少なければ十分見やすい。
$ sudo ps auxe | { head -1;grep '418[6]'; }
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4186 0.0 0.3 416252 28452 ? Ss Jun05 0:02 /usr/sbin/httpd TERM=xterm TMPDIR=/dev/shm PATH=/sbin:/usr/sbin:/bin:/usr/bin PWD=/ LANG=C SHLVL=2 _=/usr/sbin/httpd
$
スペース区切りでコマンドの後ろに環境変数が表示されるため、閲覧はしやすいが、結果の再利用はしづらい。
sed
確認したいプロセスIDがわかっているとき、stringsが一番簡潔に書けるのは一番初めに示したが、sedでnull文字を置換してあげても同様の結果が得られる。sedでnull文字は\x0
と書く。
$ sudo cat /proc/4186/environ | sed 's/\x0/\n/g'
TERM=xterm
TMPDIR=/dev/shm
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
LANG=C
SHLVL=2
_=/usr/sbin/httpd
# 当然、cat + sedでなく、sed単体でも問題ない。
# sudo sed 's/\x0/\n/g' /proc/4186/environ
tr
sedと同じ考えでtrで実施する。trでnull文字は\0
と書く。
$ sudo cat /proc/4186/environ | tr '\0' '\n'
TERM=xterm
TMPDIR=/dev/shm
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
LANG=C
SHLVL=2
_=/usr/sbin/httpd
od
odを紹介しているサイトがあったが、オプションが長すぎることと毎日使うようなコマンドではないことから、あまりお勧めできない。
sudo od -S1 -An /proc/4186/environ