Unixシステムの環境変数に関連するいくつかの問題をトラブルシューティングする必要があります。
Windowsでは、ProcessExplorerなどのツールを使用して特定のプロセスを選択し、各環境変数の値を表示できます。
Unixで同じことをどのように達成できますか?echoing
とenv
cmdは現在の値を表示するだけですが、実行中のプロセスが現在使用している値を表示したいと思います。
Unixシステムの環境変数に関連するいくつかの問題をトラブルシューティングする必要があります。
Windowsでは、ProcessExplorerなどのツールを使用して特定のプロセスを選択し、各環境変数の値を表示できます。
Unixで同じことをどのように達成できますか?echoing
とenv
cmdは現在の値を表示するだけですが、実行中のプロセスが現在使用している値を表示したいと思います。
回答:
cat /proc/<pid>/environ
実行中の実行可能ファイルのPIDが必要な場合は、他の多くの可能性の中で、次を使用できますpidof
。
AlberT$ pidof sshd
30690 6512
編集:
より読みやすい出力を実現するために、デニスウィリアムソンとテディのコメントを完全に引用します。私の解決策は次のとおりです。
tr '\0' '\n' < /proc/<pid>/environ
cat /proc/17330/environ | tr \\0 \\n
xargs --null --max-args=1 echo < /proc/PID/environ
/proc
ファイルシステム全体は移植性がありません。
xargs
nullを改行に変換するのに使用する方が良いのはなぜかわかりませんtr
。誰かが私のためにそれをレイアウトできますか?ありがとう。
この質問にはunixタグがあり、他の誰もがlinuxタグに対処するためにこのような素晴らしい仕事をしているので、OS Xや他のBSD派生システムでこの情報を得ることができます
ps -p <PID> -wwwe
または
ps -p <PID> -wwwE
およびSolarisの場合
/usr/ucb/ps -wwwe <PID>
/proc
あいまいなps
コマンドを覚えたくない場合にも、Solarisはディレクトリをサポートします。
ps -p <PID> -wwE
。
/proc/PID/environ
ます。これらのファイルは、プロセスの所有者のみが読み取り可能です。
他の人が述べたように、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マンページはかなりわかりにくいです。(経由)
ps eww $pid
2番目の問題は修正されました。
xargs
またはtr
改行に変換する方法を示しています。おそらく4年の間にこれを実現したでしょう。
の値を解析する一時関数を作成できます/proc/<pid>/environ
。端末プロンプトで:
envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }
次に、必要なプロセスのPIDを使用して、以下を使用します。
envof <pid>
かなりまばらに文書化されていますが、の内容に/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
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
Macソリューション、おそらく他のBSDも同様です
pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-
環境変数はコマンドラインに追加されます。これによりコマンドラインが削除され、環境変数のみが残ります。
LFではなくスペースで区切られているため、完全ではありません