Unixで実行中のプロセスの環境変数?


231

Unixシステムの環境変数に関連するいくつかの問題をトラブルシューティングする必要があります。

Windowsでは、ProcessExplorerなどのツールを使用して特定のプロセスを選択し、各環境変数の値を表示できます。

Unixで同じことをどのように達成できますか?echoingenvcmdは現在の値を表示するだけですが、実行中のプロセスが現在使用している値を表示したいと思います。


2
/ proc / <pid> / environのサイズは0ですが、そこにはまだ情報があります。「カーネルへのウィンドウと考えるとより理にかなっています。ファイルには実際にはデータが含まれていません。実際のプロセス情報が存在する場所へのポインタとして機能します。」[ソース ]
-nevets1219

回答:


295
cat /proc/<pid>/environ

実行中の実行可能ファイルのPIDが必要な場合は、他の多くの可能性の中で、次を使用できますpidof

AlberT$ pidof sshd   
30690 6512 

編集

より読みやすい出力を実現するために、デニスウィリアムソンテディのコメントを完全に引用します。私の解決策は次のとおりです。

tr '\0' '\n' < /proc/<pid>/environ

46
それは読みやすくするために、ヌルは改行に変換:cat /proc/17330/environ | tr \\0 \\n
デニスウィリアムソン

32
私はいつもxargs --null --max-args=1 echo < /proc/PID/environ
テディ

7
文字列を使いやすく、高速です。猫はまだ速いです:
ニヒルマレー

3
/procファイルシステム全体は移植性がありません。
ダニエルH

6
xargsnullを改行に変換するのに使用する方が良いのはなぜかわかりませんtr。誰かが私のためにそれをレイアウトできますか?ありがとう。
ジョナサンハートリー

61

この質問にはunixタグがあり、他の誰もがlinuxタグに対処するためにこのような素晴らしい仕事をしているので、OS Xや他のBSD派生システムでこの情報を得ることができます

ps -p <PID> -wwwe

または

ps -p <PID> -wwwE

およびSolarisの場合

/usr/ucb/ps -wwwe <PID>

/procあいまいなpsコマンドを覚えたくない場合にも、Solarisはディレクトリをサポートします。


3
II OS X 10.6でps -p <PID> -wwweを実行します実行中のすべてのプロセスのリストを取得します。正しいコマンドは、-eではなく-Eフラグを使用しています。
drAlberT

1
OS X 10.4でテストしましたが、10.5ではテストしませんでした。それに応じて更新。
ジェラルドコームズ

4
これは完璧ではありません。-Eオプションは、初期環境変数のみを報告します。実行中のプロセス自体によって変数が変更されている場合(POSIX putenv()関数の使用など)、変更はの出力に反映されませんps -p <PID> -wwE
カル

1
自分が所有していないプロセスのenv変数が表示されないことは、望ましい機能のようです。@drAlberTのを使用したLinux指向の回答にも当てはまり/proc/PID/environます。これらのファイルは、プロセスの所有者のみが読み取り可能です。
ジョナサンハートリー

1
@yani可能ですが、はるかに難しく、実行中のプロセスにデバッガーをアタッチする必要があります。この回答を参照してください:unix.stackexchange.com/a/70636
Kal

25

他の人が述べたように、Linuxでは/ procを見ることができますが、カーネルのバージョンに応じて、1つまたは2つの制限があります。

まず、environファイルには、プロセスが生成されたときの環境が含まれています。これは、プロセスが環境に加えた変更が/ procに表示されないことを意味します。

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

最初のシェルはログインシェルであり、最初は非常に限られた環境しかありませんが、たとえば.bashrcをソースとしてそれを拡張しますが、/ procはこれを反映しません。2番目のシェルは最初からより大きな環境を継承しているため、/ procに表示されます。

また、古いカーネルでは、environファイルのコンテンツはページサイズ(4K)に制限されています。

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

2.6.9(RHEL4)と2.6.18(RHEL5)の間のどこかでこの制限は削除されました...


1
プロセスが生成された後に設定されたリモートプロセスの環境変数を取得することは可能ですか?VFSでは、/ proc / self / environで表示されますが、プロセス内にいる場合のみ表示されます。しかし、リモートプロセスでこれを取得する方法は?
-GP92

11

これを行うためのBSDオプションの正しい使用法(少なくともLinuxで):

ps e $pid

または

ps auxe  #for all processes

はい、psマンページはかなりわかりにくいです。(経由


私のUbuntuは環境変数をコマンドラインに対して破壊し、それらの間にスペースを入れずに、ターミナルウィンドウの1行に切り捨てます。ps eww $pid2番目の問題は修正されました。
user18911

1
@ user18911:env変数にはヌル文字セパレータがあります。このページの他の回答は、読みやすくするためにこれらを使用する方法xargsまたはtr改行に変換する方法を示しています。おそらく4年の間にこれを実現したでしょう。
ジョナサンハートリー

7
cat /proc/PID/environ

PIDを表示したいプロセスのPIDに置き換えます。実行中のプロセスに関するすべての情報は/ proc / PID /ディレクトリの下にあります

例:cat / proc / 32512 / environ


7

Archlinux wikiから取得

の値を解析する一時関数を作成できます/proc/<pid>/environ。端末プロンプトで:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

次に、必要なプロセスのPIDを使用して、以下を使用します。

envof <pid>



5

かなりまばらに文書化されていますが、の内容に/proc/<pid>/environはプロセスの開始に使用された環境のみが含まれます。

プロセスの環境の現在の状態を検査する必要がある場合、それを行う1つの方法はを使用することgdbです。

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end

3

そして、私の仕事が私をAIXファンの少年にしたので、忘れないでください:

ps eww [pid]

または、manページで「Berkeley Standards」と呼ばれています。

何らかの理由で、/ proc / PID / environはAIXに存在しません。


2

env任意のプロセス(PID)の環境変数のフォーマットされた出力を作成する場合は、penv <pid>(OSに合わせた)便利なbash コマンドを作成し、それをに追加できます.bashrc

Linuxはこれを〜/ .bashrcに追加します。

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSDはこれを〜/ .bashrcに追加します:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Solarisはこれを〜/ .bashrcに追加します。

penv() {
   pargs -e $1
}

使用法:

$ source $ HOME / .bashrc
$ pgrep VBoxSVC
10268
$ penv 10268
SSH_CONNECTION = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = sl = 49; 39:cx = 49; 39:mt = 49; 38; 5; 167; 1:fn = 49; 39; 1:ln = 49; 39:bn = 49; 39:se = 50; 39
LANG = en_US.UTF-8
EDITOR = vim
XDG_SESSION_ID = 106
USER = root
PWD = / root
HOME = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
TERM = xterm-256color
SHELL = / bin / bash
SHLVL = 1
LOGNAME = root
DBUS_SESSION_BUS_ADDRESS = unix:path = / run / user / 0 / bus
XDG_RUNTIME_DIR = / run / user / 0
PATH = / root / bin:/ bin:/ sbin:/ usr / bin:/ usr / sbin:/ usr / local / bin:/ usr / local / sbin:
VBOX_LOG_FLAGS =スレッドTSC
VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf

0

Macソリューション、おそらく他のBSDも同様です

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

環境変数はコマンドラインに追加されます。これによりコマンドラインが削除され、環境変数のみが残ります。

LFではなくスペースで区切られているため、完全ではありません


-1

/ proc / PID / environ

このため、最初にプロセスのPIDを識別する必要があります。このためには、psコマンドを使用できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.