Variabili d'ambiente di un processo in esecuzione su Unix?


231

Ho bisogno di risolvere alcuni problemi relativi alle variabili di ambiente su un sistema Unix.

Su Windows, posso utilizzare uno strumento come ProcessExplorer per selezionare un processo particolare e visualizzare i valori di ciascuna variabile di ambiente.

Come posso realizzare la stessa cosa su Unix? echoinge envcmd mostra solo i valori al momento, ma voglio vedere quali sono i valori attualmente utilizzati dal processo in esecuzione.


2
Anche se / proc / <pid> / environment ha una dimensione pari a 0, ci sono ancora informazioni. "Ha più senso se lo si considera come una finestra nel kernel. Il file in realtà non contiene alcun dato; funge solo da puntatore a dove risiedono le informazioni sul processo reale." [fonte ]
nevets1219

Risposte:


295
cat /proc/<pid>/environ

Se vuoi avere i pid di un dato eseguibile in esecuzione puoi, tra una serie di altre possibilità, usare pidof:

AlberT$ pidof sshd   
30690 6512 

MODIFICA :

Cito totalmente i commenti di Dennis Williamson e Teddy per ottenere un risultato più leggibile. La mia soluzione è la seguente:

tr '\0' '\n' < /proc/<pid>/environ

46
Per renderlo leggibile, converti i null in newline:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson,

32
Lo faccio semprexargs --null --max-args=1 echo < /proc/PID/environ
Teddy,

7
meglio usare le stringhe, è veloce. Il gatto è ancora più veloce :-)
Nikhil Mulley

3
L'intero /procfilesystem non è portatile.
Daniel H,

6
Non capisco perché usare xargsper convertire i null in newline sia meglio dell'uso tr. Qualcuno può stenderlo per me? Grazie.
Jonathan Hartley,

61

Dato che questa domanda ha un tag unix e tutti gli altri hanno fatto un ottimo lavoro affrontando il tag linux , puoi ottenere queste informazioni su OS X e altri sistemi derivati ​​da BSD usando

ps -p <PID> -wwwe

o

ps -p <PID> -wwwE

e su Solaris con

/usr/ucb/ps -wwwe <PID>

Solaris supporta anche la /procdirectory se non si desidera ricordare l'oscuro pscomando.


3
II eseguito ps p <PID> -wwwe su OS X 10.6 Ho l'elenco di tutti i processi in esecuzione. il comando giusto è con -E flag, non -e.
drAlberT,

1
Ho testato su OS X 10.4, ma non 10.5. Aggiornato di conseguenza.
Gerald Combs,

4
Questo non è perfetto L'opzione -E riporta solo le variabili di ambiente iniziali . Se le variabili sono state modificate dal processo in esecuzione stesso (ad es. Mediante l'uso della funzione POSIX putenv ()), le modifiche non si riflettono nell'output di ps -p <PID> -wwE.
Kal

1
Non vedere vari processi non di tua proprietà sembra una caratteristica desiderabile. È anche il caso della risposta orientata a Linux di @ drAlberT /proc/PID/environ. Tali file sono leggibili solo dal proprietario del processo.
Jonathan Hartley,

1
@yani È possibile, ma è molto più difficile, richiede il collegamento di un debugger al processo in esecuzione. Vedi questa risposta: unix.stackexchange.com/a/70636
Kal,

25

Come altri hanno già detto, su Linux, puoi guardare in / proc ma ci sono, a seconda della versione del tuo kernel, uno o due limiti:

Prima di tutto, il file environment contiene l'ambiente come appariva quando è stato generato il processo. Ciò significa che qualsiasi modifica che il processo potrebbe aver apportato al suo ambiente non sarà visibile in / proc:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

La prima shell è una shell di accesso e inizialmente ha un ambiente molto limitato, ma la cresce acquistando ad esempio .bashrc ma / proc non riflette questo. La seconda shell eredita l'ambiente più grande dall'inizio, motivo per cui viene mostrato in / proc.

Inoltre, sui kernel più vecchi, il contenuto del file environment è limitato a una dimensione di pagina (4K):

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

Da qualche parte tra 2.6.9 (RHEL4) e 2.6.18 (RHEL5) questo limite è stato rimosso ...


1
È possibile ottenere le variabili ambientali di un processo remoto che sono state impostate dopo che il processo è stato generato? Capisco che su VFS, viene mostrato con / proc / self / environment ma solo se siamo all'interno del processo. Ma come ottenerlo per un processo remoto?
GP92

11

uso corretto delle opzioni BSD per fare questo (almeno su Linux):

ps e $pid

o

ps auxe  #for all processes

e sì, la manpage ps è piuttosto confusa. ( via )


Ubuntu frantuma le variabili di ambiente contro la riga di comando, senza nemmeno uno spazio tra loro, e si tronca anche su una riga nella finestra del terminale. Ho trovato ps eww $pidrisolve il secondo problema.
user18911

1
@ user18911: Le variabili env hanno un separatore di caratteri null. Altre risposte in questa pagina mostrano i modi per utilizzare xargso trconvertire questi in newline per la leggibilità. Probabilmente te ne sei reso conto nei quattro anni successivi.
Jonathan Hartley,

7
cat /proc/PID/environ

sostituire il PID con il PID del processo che si desidera vedere. Tutte le informazioni su un processo in esecuzione si trovano nella directory / proc / PID /

esempio: cat / proc / 32512 / ambi


7

Tratto dal wiki di Archlinux :

È possibile creare una funzione temporanea per analizzare i valori /proc/<pid>/environ. Al prompt del terminale:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

Quindi con il pid del processo desiderato, basta usare:

envof <pid>

6

Sotto Linux, proverei a dare un'occhiata

/proc/<pid>/environ


5

Sebbene piuttosto scarsamente documentato, il contenuto di /proc/<pid>/environconterrà solo l'ambiente utilizzato per avviare il processo.

Se è necessario ispezionare lo stato corrente di un 'ambiente di processo, un modo per farlo è utilizzare 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

3

E poiché il mio lavoro mi fa diventare un fan boy di AIX, non dimentichiamoci:

ps eww [pid]

O come lo chiama la pagina man, "Berkeley Standards".

Per qualsiasi motivo, / proc / PID / environment non esiste in AIX.


2

Se vuoi creare formattato envcome l'output delle variabili di ambiente per un processo arbitrario (PID), puoi creare un comodo penv <pid>comando bash (su misura per il tuo sistema operativo) e aggiungerlo a .bashrc:

Linux aggiungi questo al tuo ~ / .bashrc:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD aggiungi questo al tuo ~ / .bashrc:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Solaris aggiunge questo al tuo ~ / .bashrc:

penv() {
   pargs -e $1
}

Uso:

$ 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 = it_IT.UTF-8
EDITOR = vim
XDG_SESSION_ID = 106
USER = radice
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 = radice
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

0

Una soluzione mac, probabilmente anche altri BSD potrebbero essere qualcosa del genere

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

Le variabili di ambiente vengono aggiunte alla riga di comando, ciò rimuove la riga di comando e rimangono solo le variabili di ambiente.

Non è perfetto perché sono separati da spazi non separati da LF


-1

/ Proc / PID / environ

per questo, per prima cosa dobbiamo identificare il PID del processo. per questo puoi usare il comando ps

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.