Variables d'environnement d'un processus en cours d'exécution sur Unix?

231

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 un processus et afficher les valeurs de chaque variable d’environnement.

Comment puis-je accomplir la même chose sous Unix? echoinget envcmd affichent simplement les valeurs à l'heure actuelle, mais je souhaite afficher les valeurs actuellement utilisées par le processus en cours.

m3rLinEz
la source
2
Même si / proc / <pid> / environ a une taille de 0, il contient toujours des informations. "Cela a plus de sens si vous le considérez comme une fenêtre sur le noyau. Le fichier ne contient aucune donnée; il agit simplement comme un pointeur indiquant où se trouvent les informations de processus." [source ]
nevets1219

Réponses:

295
cat /proc/<pid>/environ

Si vous voulez avoir des pid (s) d’un exécutable en cours, vous pouvez, parmi un certain nombre de possibilités, utiliser pidof:

AlberT$ pidof sshd   
30690 6512 

EDIT :

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

tr '\0' '\n' < /proc/<pid>/environ
drAlberT
la source
46
Pour le rendre lisible, convertissez les valeurs null en nouvelles lignes:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson
32
Je fais toujoursxargs --null --max-args=1 echo < /proc/PID/environ
Teddy
7
mieux utiliser les chaînes, c'est rapide. Le chat est encore plus rapide :-)
Nikhil Mulley
3
L'ensemble du /procsystème de fichiers n'est pas portable.
Daniel H
6
Je ne comprends pas pourquoi utiliser xargspour convertir des valeurs NULL en nouvelles lignes est préférable à une utilisation tr. Est-ce que quelqu'un peut me le présenter? Merci.
Jonathan Hartley
61

Puisque cette question a une balise unix et que tout le monde a fait un travail remarquable en adressant une 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 /procrépertoire si vous ne souhaitez pas vous souvenir de la commande obscure ps.

Gérald Combs
la source
3
II exécutez ps -p <PID> -wwwe sur OS X 10.6 Je reçois la liste de tous les processus en cours d' exécution. la bonne commande est avec l' option -E , pas -e.
drAlberT
1
J'ai testé sur OS X 10.4, mais pas 10.5. Mis à jour en conséquence.
Gerald Combs
4
Ce n'est pas parfait L'option -E ne rapporte que les variables d'environnement initiales . Si les variables ont été modifiées par le processus en cours d'exécution lui-même (par exemple, à l'aide de la fonction POSIX putenv ()), les modifications ne sont pas reflétées dans le résultat de ps -p <PID> -wwE.
Kal
1
Ne pas voir les vars des processus qui ne vous appartiennent pas ressemble à une fonctionnalité souhaitable. C'est également le cas de la réponse orientée Linux de @ drAlberT /proc/PID/environ. Ces fichiers ne sont lisibles que par le propriétaire du processus.
Jonathan Hartley
1
@yani C'est possible, mais c'est beaucoup plus difficile, il faut attacher un débogueur au processus en cours. Voir la réponse suivante: unix.stackexchange.com/a/70636
Kal
25

Comme d'autres l'ont mentionné, sous Linux, vous pouvez consulter / proc, mais il existe, en fonction de 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 génération du processus. Cela signifie que toute modification apportée par le processus à son environnement ne sera pas visible 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 au départ un environnement très limité, mais il est développé par sourcing, par exemple .bashrc, mais / proc ne le reflète pas. Le deuxième shell hérite dès le départ de l’environnement le plus large, ce qui explique pourquoi il apparaît dans / proc.

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

$ 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 ...

Lasse
la source
1
Est-il possible d'obtenir les variables d'environnement d'un processus distant qui ont été définies après la création du processus? Je comprends que sur VFS, cela est montré avec / proc / self / environ mais seulement si nous sommes dans le processus. Mais comment l'obtenir pour un processus distant?
GP92 le
11

utiliser correctement les options BSD pour le faire (au moins sur linux):

ps e $pid

ou

ps auxe  #for all processes

et oui, ps manpage est assez déroutant. ( via )

raincrumb
la source
Mon Ubuntu écrase les variables d’environnement contre la ligne de commande, sans même qu’un espace entre elles, et tronque également une ligne de la fenêtre du terminal. J'ai trouvé ps eww $pidcorrige le 2ème problème.
user18911
1
@ user18911: Les vars env ont un séparateur de caractère nul. Les autres réponses sur cette page montrent des manières d’utiliser xargsou trde convertir ces dernières en nouvelles lignes pour plus de lisibilité. Vous avez probablement compris cela dans les quatre années qui ont suivi.
Jonathan Hartley
7
cat /proc/PID/environ

remplacez le PID par le PID du processus que vous voulez voir. Toutes les informations sur un processus en cours sont sous / proc / PID / directory

exemple: cat / proc / 32512 / environ

Kargig
la source
7

Tiré du wiki Archlinux :

Vous pouvez créer une fonction temporaire pour analyser les valeurs /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>
Mwotton
la source
6

Sous Linux, je voudrais essayer de regarder

/proc/<pid>/environ
Joril
la source
5

Pour Solaris 5.10, cela fonctionne:

pargs -e <PID>
Mykola Novik
la source
5

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

Si vous devez inspecter l'état actuel de l'environnement d'un processus, utilisez l'une des méthodes suivantes 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
Michael Renner
la source
3

Et comme mon travail me rend fan d’AIX, n’oublions pas:

ps eww [pid]

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

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

Corey S.
la source
2

Si vous voulez créer une envsortie formatée comme la sortie des variables d’environnement pour un processus arbitraire (PID), vous pouvez créer une penv <pid>commande commode bash (adaptée à votre système d’exploitation) et l’ajouter à votre .bashrc:

Linux ajoute ceci à votre ~ / .bashrc:

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

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

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

Solaris ajoute 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
ÉDITEUR = vim
XDG_SESSION_ID = 106
USER = racine
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 / utilisateur / 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
clair
la source
0

Une solution mac, probablement d’autres BSD, pourrait ressembler à 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 reste plus que les variables d'environnement.

Ce n'est pas parfait car ils sont séparés par un espace et non par une séparation

Erik Martino
la source
-1

/ proc / PID / environ

pour cela, nous devons d’abord identifier le PID du processus. pour cela, vous pouvez utiliser la commande ps

Varun
la source