Question Variables d'environnement d'un processus en cours d'exécution 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 un processus et afficher les valeurs de chaque variable d’environnement.

Comment puis-je accomplir la même chose sous Unix? echoing et env cmd n'affiche que les valeurs actuelles, mais je souhaite afficher les valeurs actuellement utilisées par le processus en cours.


200
2017-09-17 18:14


origine


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 en réalité aucune donnée; il agit simplement comme un pointeur indiquant où se trouvent les informations de processus." [la source] - nevets1219


Réponses:


cat /proc/<pid>/environ

Si vous voulez avoir des pid (s) d’un exécutable en cours, vous pouvez, entre autres possibilités, utiliser pidof:

AlberT$ pidof sshd   
30690 6512 

MODIFIER:

Je cite totalement le commentaire de @Teddy pour obtenir une sortie plus lisible:

xargs --null --max-args=1 < /proc/<pid>/environ

257
2017-09-17 18:18



Pour le rendre lisible, convertissez les valeurs NULL en nouvelles lignes: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
je fais toujours xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
mieux utiliser les chaînes, c'est rapide. Le chat est encore plus rapide :-) - Nikhil Mulley
La totalité /proc Le système de fichiers n’est pas portable. - Daniel H
Je ne comprends pas pourquoi utiliser xargsMieux vaut convertir les valeurs nulles en nouvelles lignes que d'utiliser tr. Est-ce que quelqu'un peut me le présenter? Merci. - Jonathan Hartley


Depuis cette question a un unix tag et tout le monde a fait un si bon travail d'adressage linux balise, 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 l'obscur ps commmand.


52
2017-09-17 20:47



Je cours ps -p <PID> -www sur OS X 10.6, je reçois la liste de tous les processus en cours. la bonne commande est avec -E drapeau, pas -e. - drAlberT
J'ai testé sur OS X 10.4, mais pas 10.5. Mis à jour en conséquence. - Gerald Combs
Ce n'est pas parfait L'option -E ne signale que le initiale Variables d'environnement. 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 la sortie de ps -p <PID> -wwE. - Kal
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 utilisant /proc/PID/environ. Ces fichiers ne sont lisibles que par le propriétaire du processus. - Jonathan Hartley
@yani C'est possible, mais c'est beaucoup plus difficile, il faut attacher un débogueur au processus en cours. Voir cette réponse: unix.stackexchange.com/a/70636 - Kal


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 se développe en procédant par exemple à l’approvisionnement. .bashrc mais / proc ne reflète pas cela. 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 ...


24
2017-10-29 11:27



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? - Jeevan Patnaik


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

ps e $pid

ou

ps auxe  #for all processes

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


10
2018-03-04 12:15



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 $pid corrige le 2ème problème. - user18911
@ user18911: les vars env ont un séparateur de caractère nul. Les autres réponses sur cette page montrent comment utiliser xargs ou tr pour les convertir en nouvelles lignes pour plus de lisibilité. Vous avez probablement compris cela dans les quatre années qui ont suivi. - Jonathan Hartley


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
2017-09-17 18:19





Sous Linux, je voudrais essayer de regarder

/proc/<pid>/environ

6
2017-09-17 18:19





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>

6
2018-01-13 23:05





Pour Solaris 5.10, cela fonctionne:

pargs -e <PID>

4
2017-08-08 10:04