sviluppo-web-qa.it

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

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? echoing e env cmd mostrano solo i valori al momento, ma voglio vedere quali sono i valori attualmente utilizzati dal processo in esecuzione.

235
m3rLinEz
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 Dennis Williamson e Teddy commenti per ottenere un risultato più leggibile. La mia soluzione è la seguente:

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

Poiché questa domanda ha un tag nix 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 /proc directory se non vuoi ricordare l'oscuro ps commmand.

63
Gerald Combs

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 lo cresce acquistando ad es. .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 ...

25
Lasse

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 )

11
raincrumb

Mentre piuttosto scarsamente documentato, il contenuto di /proc/<pid>/environ conterrà 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
7
Michael Renner
cat /proc/PID/environ

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

esempio: cat/proc/32512/ambi

7
kargig

Tratto da Archlinux wiki :

Puoi creare una funzione temporanea per analizzare i valori in /proc/<pid>/environ. Al prompt Terminale:

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

Quindi con il pid del processo desiderato, basta usare:

envof <pid>
7
mwotton

Per Solaris 5.10, funziona:

pargs -e <PID>
6
Mykola Novik

Sotto Linux, proverei a dare un'occhiata

/proc/<pid>/environ
6
Joril

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

ps eww [pid]

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

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

4
Corey S.

Se si desidera creare env formattato come l'output delle variabili di ambiente per un processo arbitrario (PID), è possibile creare un comodo bash penv <pid> comando (su misura per il tuo sistema operativo) e aggiungilo al tuo .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 aggiungi 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 = en_US.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:.... percorso =/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 
3
clearlight

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 dallo spazio non LF separati

0
Erik Martino