Unixシステムの環境変数に関連するいくつかの問題をトラブルシューティングする必要があります。
Windowsでは、ProcessExplorerなどのツールを使用して特定のプロセスを選択し、各環境変数の値を表示できます。
Unixで同じことをするにはどうすればよいですか? echoing
およびenv
cmdは現時点で値を表示するだけですが、実行中のプロセスが現在使用している値を確認したいと思います。
cat /proc/<pid>/environ
実行中の特定の実行可能ファイルのpidが必要な場合は、他の多くの可能性の中で、pidof
を使用できます。
AlberT$ pidof sshd
30690 6512
[〜#〜]編集[〜#〜]:
より読みやすい出力を実現するために、 Dennis Williamson および Teddy コメントを完全に引用します。私の解決策は次のとおりです:
tr '\0' '\n' < /proc/<pid>/environ
この質問にはnixタグがあり、他の誰もがlinuxタグに対応する素晴らしい仕事をしたので、OS Xおよび他のBSD派生システムでこの情報を取得できます。
ps -p <PID> -wwwe
または
ps -p <PID> -wwwE
とSolarisで
/usr/ucb/ps -wwwe <PID>
あいまいなps
コマンドを覚えたくない場合、Solarisは/proc
ディレクトリもサポートします。
他の人が述べたように、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)の間のどこかで、この制限は削除されました...
これを行うためのBSDオプションの正しい使用法(少なくともLinuxでは):
ps e $pid
または
ps auxe #for all processes
はい、psマンページはかなり混乱しています。 ( via )
かなりまばらに文書化されていますが、/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
cat /proc/PID/environ
pIDを、表示するプロセスのPIDに置き換えます。実行中のプロセスに関するすべての情報は/ proc/PID /ディレクトリの下にあります
例:cat/proc/32512/environ
Archlinux wiki から取得:
/proc/<pid>/environ
の値を解析する一時関数を作成できます。端末プロンプトで:
envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }
次に、必要なプロセスのPIDを使用して、次のように使用します。
envof <pid>
Solaris 5.10の場合、これは機能します。
pargs -e <PID>
Linuxの下で、私は見てみようと思います
/proc/<pid>/environ
そして、私の仕事は私をAIXファンの少年にするので、忘れないでください。
ps eww [pid]
または、manページで「Berkeley Standards」と呼んでいます。
何らかの理由で、/ proc/PID/environはAIXには存在しません。
任意のプロセス(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
Macソリューション、おそらく他のBSDも次のようなものになる可能性があります
pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-
環境変数がコマンドラインに追加されます。これにより、コマンドラインが削除され、環境変数のみが残ります。
スペースで区切られていないため、完全ではありませんLF区切られています