Řešení 1:
cat /proc/<pid>/environ
Pokud chcete mít pid(y) daného běžícího spustitelného souboru, můžete kromě řady dalších možností použít pidof
:
AlberT$ pidof sshd
30690 6512
UPRAVIT :
Úplně cituji komentáře Dennise Williamsona a Teddyho, abych dosáhl čitelnějšího výstupu. Moje řešení je následující:
tr '\0' '\n' < /proc/<pid>/environ
Řešení 2:
Protože tato otázka má unix a všichni ostatní odvedli skvělou práci při řešení linuxu můžete tyto informace získat na OS X a dalších systémech odvozených od BSD pomocí
ps -p <PID> -wwwe
nebo
ps -p <PID> -wwwE
a na Solaris s
/usr/ucb/ps -wwwe <PID>
Solaris také podporuje /proc
adresář, pokud si nechcete pamatovat nejasný ps
příkaz.
Řešení 3:
Jak již uvedli jiní, na Linuxu se můžete podívat do /proc, ale v závislosti na verzi vašeho jádra existují jedno nebo dvě omezení:
Za prvé, soubor environ obsahuje prostředí, jak vypadalo, když byl proces vytvořen. To znamená, že jakékoli změny, které proces mohl provést ve svém prostředí, nebudou viditelné v /proc:
$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$
První shell je přihlašovací shell a zpočátku má velmi omezené prostředí, ale rozvíjí jej získáváním zdrojů, např. .bashrc, ale /proc to neodráží. Druhý shell zdědí větší prostředí od začátku, a proto se zobrazuje v /proc.
Na starších jádrech je také obsah souboru environ omezen na velikost stránky (4K):
$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$
Někde mezi 2.6.9 (RHEL4) a 2.6.18 (RHEL5) byl tento limit odstraněn...
Řešení 4:
správné použití možností BSD k tomu (alespoň na linuxu):
ps e $pid
nebo
ps auxe #for all processes
a ano, manuálová stránka ps je docela matoucí. (přes)
Řešení 5:
I když je obsah /proc/<pid>/environ
poměrně řídce zdokumentován bude obsahovat pouze prostředí, které bylo použito ke spuštění procesu.
Pokud potřebujete zkontrolovat aktuální stav prostředí procesu, jedním ze způsobů, jak to udělat, je použít 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