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.
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
É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
.
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 ...
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 )
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
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
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>
Pour Solaris 5.10, cela fonctionne:
pargs -e <PID>
Sous Linux, j'essaierais de jeter un œil à
/proc/<pid>/environ
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.
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
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