GNU/Linux >> Znalost Linux >  >> Linux

Proměnné prostředí běžícího procesu na Unixu?

Ř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

Linux
  1. Jak předat argumenty příkazového řádku běžícímu procesu na systémech unix/linux?

  2. Jak zjistit, zda běží v linuxové konzoli oproti relaci ssh?

  3. Kontrola proměnných prostředí

  1. Nastavit dočasné prostředí ($PATH)

  2. Použití proměnných prostředí v příkazu cURL - Unix

  3. Jak zrušit nastavení mnoha proměnných prostředí

  1. Změnit prostředí běžícího procesu?

  2. Jaké je PID v hostiteli procesu běžícího uvnitř kontejneru Docker?

  3. Jsou soubory .pid spolehlivé pro určení, zda je proces spuštěn?