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.


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

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.


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


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 )


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


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>

6

Sous Linux, je voudrais essayer de regarder

/proc/<pid>/environ


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

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.


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

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


-1

/ proc / PID / environ

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.