web-dev-qa-db-fra.com

Variables d'environnement d'un processus en cours sur Unix?

J'ai besoin de résoudre certains problèmes liés aux variables d'environnement sur un système Unix.

Sous Windows, je peux utiliser un outil tel que ProcessExplorer pour sélectionner notamment un processus et afficher les valeurs de chaque variable d'environnement.

Comment puis-je accomplir la même chose sur Unix? echoing et env cmd montrent juste les valeurs à l'heure actuelle, mais je veux voir quelles valeurs le processus en cours utilise actuellement.

235
m3rLinEz
cat /proc/<pid>/environ

Si vous voulez avoir le (s) pid (s) d'un exécutable donné, vous pouvez, entre autres possibilités, utiliser pidof:

AlberT$ pidof sshd   
30690 6512 

[~ # ~] modifier [~ # ~]:

Je cite totalement Dennis Williamson et Teddy commentaires pour obtenir une sortie plus lisible. Ma solution est la suivante:

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

Étant donné que cette question a une balise nix et que tout le monde a fait un excellent travail d'adressage de la balise linux, vous pouvez obtenir ces informations sur OS X et d'autres systèmes dérivés de BSD en utilisant

ps -p <PID> -wwwe

ou

ps -p <PID> -wwwE

et sur Solaris avec

/usr/ucb/ps -wwwe <PID>

Solaris prend également en charge le /proc répertoire si vous ne voulez pas vous souvenir de la commande obscure ps.

63
Gerald Combs

Comme d'autres l'ont mentionné, sous Linux, vous pouvez regarder dans/proc mais il y a, selon la version de votre noyau, une ou deux limites:

Tout d'abord, le fichier environ contient l'environnement tel qu'il était lors de la création du processus. Cela signifie que toutes les modifications que le processus pourrait avoir apportées à son environnement ne seront pas visibles dans/proc:

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

Le premier shell est un shell de connexion et a initialement un environnement très limité, mais il se développe en s'approvisionnant par exemple .bashrc mais/proc ne reflète pas cela. Le deuxième Shell hérite de l'environnement plus large dès le début, ce qui explique pourquoi il s'affiche dans/proc.

De plus, sur les noyaux plus anciens, le contenu du fichier environ est limité à une taille de page (4K):

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

Quelque part entre 2.6.9 (RHEL4) et 2.6.18 (RHEL5), cette limite a été supprimée ...

25
Lasse

utilisation correcte des options BSD pour ce faire (au moins sur linux):

ps e $pid

ou

ps auxe  #for all processes

et oui, la page de manuel ps est assez déroutante. ( via )

11
raincrumb

Bien que peu documenté, le contenu de /proc/<pid>/environ ne contiendra que l'environnement utilisé pour démarrer le processus.

Si vous avez besoin d'inspecter l'état actuel d'un environnement de processus, une façon de le faire est d'utiliser 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

remplacez PID par le PID du processus que vous souhaitez voir. Toutes les informations sur un processus en cours d'exécution se trouvent dans le répertoire/proc/PID /

exemple: cat/proc/32512/environ

7
kargig

Tiré du wiki Archlinux :

Vous pouvez créer une fonction temporaire pour analyser les valeurs dans /proc/<pid>/environ. À l'invite du terminal:

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

Ensuite, avec le pid du processus que vous voulez, utilisez simplement:

envof <pid>
7
mwotton

Pour Solaris 5.10, cela fonctionne:

pargs -e <PID>
6
Mykola Novik

Sous Linux, j'essaierais de jeter un œil à

/proc/<pid>/environ
6
Joril

Et comme mon travail fait de moi un fan de AIX, n'oublions pas:

ps eww [pid]

Ou, comme l'appelle la page de manuel, "Berkeley Standards".

Pour une raison quelconque,/proc/PID/environ n'existe pas sous AIX.

4
Corey S.

Si vous souhaitez créer une sortie formatée env comme les variables d'environnement pour un processus arbitraire (PID), vous pouvez créer une bash pratique penv <pid> (adaptée à votre système d'exploitation) et ajoutez-la à votre .bashrc:

Linux ajoutez ceci à votre ~/.bashrc:

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

macOS/BSD ajoutez ceci à votre ~/.bashrc:

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

Solaris ajoutez ceci à votre ~/.bashrc:

penv() {
   pargs -e $1
}

Usage:

 $ 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 = root 
 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 = root 
 DBUS_SESSION_BUS_ADDRESS = unix: chemin =/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

Une solution mac, probablement d'autres BSD pourrait aussi être quelque chose comme

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

Les variables d'environnement sont ajoutées à la ligne de commande, cela supprime la ligne de commande et il ne nous reste que les variables d'environnement.

Ce n'est pas parfait car ils sont séparés par des espaces et non LF séparés

0
Erik Martino