解決策 1:
cat /proc/<pid>/environ
実行中の特定の実行可能ファイルの pid が必要な場合は、pidof
を使用できます。 :
AlberT$ pidof sshd
30690 6512
編集 :
出力を読みやすくするために、Dennis Williamson と Teddy のコメントを完全に引用します。私の解決策は次のとおりです。
tr '\0' '\n' < /proc/<pid>/environ
解決策 2:
この質問には unix があるため タグと他の誰もが linux に対処する素晴らしい仕事をしました タグを使用して、OS X およびその他の BSD 派生システムでこの情報を取得できます
ps -p <PID> -wwwe
または
ps -p <PID> -wwwE
およびSolarisでは
/usr/ucb/ps -wwwe <PID>
Solaris は /proc
もサポートしています あいまいな ps
を覚えたくない場合は、ディレクトリ コマンド。
解決策 3:
他の人が言及しているように、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) の間のどこかで、この制限は削除されました...
解決策 4:
これを行うための BSD オプションの正しい使用法 (少なくとも Linux では):
ps e $pid
または
ps auxe #for all processes
はい、ps のマンページはかなり紛らわしいです。(via)
解決策 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