web-dev-qa-db-ja.com

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

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

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

Unixで同じことをするにはどうすればよいですか? echoingおよびenv cmdは現時点で値を表示するだけですが、実行中のプロセスが現在使用している値を確認したいと思います。

235
m3rLinEz
cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

[〜#〜]編集[〜#〜]

より読みやすい出力を実現するために、 Dennis Williamson および Teddy コメントを完全に引用します。私の解決策は次のとおりです:

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

この質問にはnixタグがあり、他の誰もがlinuxタグに対応する素晴らしい仕事をしたので、OS Xおよび他のBSD派生システムでこの情報を取得できます。

ps -p <PID> -wwwe

または

ps -p <PID> -wwwE

とSolarisで

/usr/ucb/ps -wwwe <PID>

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

63
Gerald Combs

他の人が述べたように、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)の間のどこかで、この制限は削除されました...

25
Lasse

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

ps e $pid

または

ps auxe  #for all processes

はい、psマンページはかなり混乱しています。 ( via

11
raincrumb

かなりまばらに文書化されていますが、/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
7
Michael Renner
cat /proc/PID/environ

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

例:cat/proc/32512/environ

7
kargig

Archlinux wiki から取得:

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

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

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

envof <pid>
7
mwotton

Solaris 5.10の場合、これは機能します。

pargs -e <PID>
6
Mykola Novik

Linuxの下で、私は見てみようと思います

/proc/<pid>/environ
6
Joril

そして、私の仕事は私をAIXファンの少年にするので、忘れないでください。

ps eww [pid]

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

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

4
Corey S.

任意のプロセス(PID)の環境変数の出力のようなフォーマットされたenvを作成する場合は、便利なbash penv <pid>コマンド(OSに合わせて調整)を追加して.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
}

使用法:

 $ソース$ 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 = thread tsc 
 VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf 
3
clearlight

Macソリューション、おそらく他のBSDも次のようなものになる可能性があります

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

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

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

0
Erik Martino