245 votes

Les variables d'environnement d'un processus en cours d'exécution sous Unix ?

Je dois résoudre des 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 particulier et afficher les valeurs de chaque variable d'environnement.

Comment puis-je accomplir la même chose sous Unix ? echoing y env cmd n'affiche que les valeurs actuelles, mais je veux voir les valeurs que le processus en cours utilise actuellement.

3 votes

Même si /proc/<pid>/environ a une taille de 0, il y a toujours des informations dedans. "Cela a plus de sens si vous le considérez comme une fenêtre dans le noyau. Le fichier ne contient pas réellement de données ; il agit simplement comme un pointeur vers l'endroit où résident les informations réelles du processus. " [[source](http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html) ]

316voto

drAlberT Points 10812
cat /proc/<pid>/environ

Si vous voulez avoir les pid(s) d'un exécutable en cours d'exécution, vous pouvez, parmi un certain nombre d'autres possibilités, utiliser pidof :

AlberT$ pidof sshd   
30690 6512 

EDIT :

Je cite totalement Dennis Williamson y Teddy commentaires pour obtenir un résultat plus lisible. Ma solution est la suivante :

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

50 votes

Pour le rendre lisible, convertissez les nuls en nouvelles lignes : cat /proc/17330/environ | tr \\0 \\n

34 votes

Je le fais toujours xargs --null --max-args=1 echo < /proc/PID/environ

8 votes

Il vaut mieux utiliser des cordes, c'est rapide. Le chat est toujours plus rapide :-)

64voto

Gerald Combs Points 6281

Puisque cette question a un unix tag et tous les autres ont fait un excellent travail en adressant linux vous pouvez obtenir cette information 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 l'option /proc si vous ne voulez pas vous souvenir de l'obscure ps commande.

4 votes

Je cours. ps -p <PID> -wwwe sur OS X 10.6 j'obtiens la liste de tous les processus en cours. la bonne commande est avec -E et non -e.

0 votes

J'ai réalisé que -e est égal à -E seulement si ps est en mode séquentiel

1 votes

J'ai testé sur OS X 10.4, mais pas sur 10.5. Mis à jour en conséquence.

26voto

Lasse Points 416

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 lorsque le processus a été créé. Cela signifie que tout changement que le processus aurait pu apporter à 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 initialement un environnement très limité mais le développe en sourçant par exemple .bashrc mais /proc ne reflète pas cela. Le second Shell hérite de l'environnement plus large depuis le début, c'est pourquoi il apparaît dans /proc.

De plus, sur les anciens noyaux, 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...

1 votes

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

0 votes

Ouf ! Merci pour cette réponse qui, je l'espère, est toujours valable. Ainsi, les variables d'environnement au démarrage sont visibles par les autres utilisateurs et processus du système via /proc/<pid>/environ/. Les modifications de l'environnement pendant l'exécution ne sont pas accessibles via /proc/, mais si un autre processus est créé, la variable d'environnement sera visible dans son /proc/. Je suppose que c'est la raison pour laquelle les secrets ne devraient pas être configurés via des variables d'environnement lors de l'utilisation de conteneurs, mais plutôt via des fichiers secrets coordonnés par le système d'orchestration ou l'api vault.

12voto

raincrumb Points 221

Utilisation correcte des options BSD pour faire cela (au moins sur linux) :

ps e $pid

ou

ps auxe  #for all processes

et oui, la page de manuel de ps est assez confuse. ( via )

1 votes

Mon Ubuntu écrase les variables d'environnement tout contre la ligne de commande, sans même un espace entre elles, et tronque également à une ligne dans la fenêtre du terminal. J'ai trouvé ps eww $pid corrige le 2ème problème.

1 votes

@user18911 : Les vars env ont un séparateur de caractère nul. D'autres réponses sur cette page montrent comment utiliser xargs o tr pour les convertir en nouvelles lignes pour plus de lisibilité. Vous vous en êtes probablement rendu compte au cours des quatre années qui se sont écoulées depuis.

11voto

macbirdie Points 9417

Bien qu'il soit assez peu documenté, le contenu de la base de données du /proc/<pid>/environ ne contiendra que l'environnement qui a été utilisé pour démarrer le processus.

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

1 votes

Il pourrait être amélioré en mettant ces commandes, plus une quit à la fin en une commande .gdb tel que ~/penv.gdb ; puis commence gdb(1) avec ce script de GDB à chaque fois que vous voulez examiner l'environnement d'un processus, en exécutant gdb -x ~/penv.gdb -p <pid> [<exe-file>] .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X