¿Variables de entorno de un proceso en ejecución en Unix?

231

Necesito solucionar algunos problemas relacionados con las variables de entorno en un sistema Unix.

En Windows, puedo usar una herramienta como ProcessExplorer para seleccionar un proceso particular y ver los valores de cada variable de entorno.

¿Cómo puedo lograr lo mismo en Unix? echoingy envcmd solo muestran valores en este momento, pero quiero ver qué valores está usando el proceso en ejecución actualmente.

m3rLinEz
fuente
2
Aunque / proc / <pid> / environment tiene un tamaño de 0, todavía hay información allí. "Tiene más sentido si lo piensas como una ventana al núcleo. El archivo en realidad no contiene ningún dato; solo actúa como un puntero a donde reside la información real del proceso". [fuente ]
nevets1219

Respuestas:

295
cat /proc/<pid>/environ

Si desea tener pid (s) de un ejecutable ejecutado dado, puede, entre otras posibilidades, usar pidof:

AlberT$ pidof sshd   
30690 6512 

EDITAR :

Cito totalmente los comentarios de Dennis Williamson y Teddy para lograr una salida más legible. Mi solución es la siguiente:

tr '\0' '\n' < /proc/<pid>/environ
drAlberT
fuente
46
Para que sea legible, convierta los valores nulos a líneas nuevas:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson
32
Siempre lo hagoxargs --null --max-args=1 echo < /proc/PID/environ
Teddy
77
mejor usar cuerdas, es rápido. Cat sigue siendo más rápido :-)
Nikhil Mulley
3
Todo el /procsistema de archivos no es portátil.
Daniel H
66
No entiendo por qué usar xargspara convertir nulos a nuevas líneas es mejor que usar tr. ¿Alguien me lo puede dejar? Gracias.
Jonathan Hartley
61

Dado que esta pregunta tiene una etiqueta de Unix y todos los demás han hecho un gran trabajo al abordar la etiqueta de Linux , puede obtener esta información sobre OS X y otros sistemas derivados de BSD utilizando

ps -p <PID> -wwwe

o

ps -p <PID> -wwwE

y en Solaris con

/usr/ucb/ps -wwwe <PID>

Solaris también admite el /procdirectorio si no desea recordar el oscuro pscomando.

Gerald Peines
fuente
3
II ejecutar ps -p <PID> -wwwe en OS X 10.6 Obtengo la lista de todos los procesos en ejecución. el comando correcto es con -E flag, no -e.
drAlberT
1
Probé en OS X 10.4, pero no en 10.5. Actualizado en consecuencia.
Gerald Combs
44
Esto no es perfecto La opción -E solo informa las variables de entorno iniciales . Si las variables han sido modificadas por el proceso en ejecución (por ejemplo, mediante el uso de la función POSIX putenv ()), los cambios no se reflejan en la salida de ps -p <PID> -wwE.
Kal
1
No ver los entornos de procesos que no son de su propiedad parece una característica deseable. También es el caso de la respuesta orientada a Linux de @ drAlberT usando /proc/PID/environ. Esos archivos solo pueden ser leídos por el propietario del proceso.
Jonathan Hartley
1
@yani Es posible, pero es mucho más difícil, requiere adjuntar un depurador al proceso en ejecución. Vea esta respuesta: unix.stackexchange.com/a/70636
Kal
25

Como otros han mencionado, en Linux, puede buscar en / proc pero existen, según la versión de su núcleo, uno o dos límites:

En primer lugar, el archivo entorno contiene el entorno tal como se veía cuando se generó el proceso. Eso significa que cualquier cambio que el proceso haya realizado en su entorno no será visible en / proc:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

El primer shell es un shell de inicio de sesión e inicialmente tiene un entorno muy limitado, pero lo crece obteniendo, por ejemplo, .bashrc pero / proc no refleja esto. El segundo shell hereda el entorno más grande desde el principio, por lo que se muestra en / proc.

Además, en núcleos más antiguos, el contenido del archivo ambiental está limitado a un tamaño de página (4K):

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

En algún lugar entre 2.6.9 (RHEL4) y 2.6.18 (RHEL5) este límite se eliminó ...

Lasse
fuente
1
¿Es posible obtener las variables ambientales de un proceso remoto que se establecieron después de que se genera el proceso? Entiendo que en VFS, se muestra con / proc / self / environment pero solo si estamos dentro del proceso. Pero, ¿cómo conseguir esto para un proceso remoto?
GP92
11

Uso correcto de las opciones de BSD para hacer esto (al menos en Linux):

ps e $pid

o

ps auxe  #for all processes

y sí, la página de manual de ps es bastante confusa. ( vía )

migaja de lluvia
fuente
Mi Ubuntu rompe las variables de entorno contra la línea de comandos, sin siquiera un espacio entre ellas, y también se trunca en una línea en la ventana de terminal. Encontré ps eww $pidsoluciones al segundo problema.
user18911
1
@ user18911: Los env tienen un separador de caracteres nulo. Otras respuestas en esta página muestran formas de usarlas xargso trconvertirlas a nuevas líneas para facilitar la lectura. Probablemente te hayas dado cuenta de esto en los cuatro años transcurridos.
Jonathan Hartley
7
cat /proc/PID/environ

reemplace PID con el PID del proceso que desea ver. Toda la información sobre un proceso en ejecución se encuentra en el directorio / proc / PID /

ejemplo: cat / proc / 32512 / environmental

kargig
fuente
7

Tomado de la wiki de Archlinux :

Puede crear una función temporal para analizar los valores /proc/<pid>/environ. En el indicador de terminal:

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

Luego, con el pid del proceso que desea, simplemente use:

envof <pid>
mwotton
fuente
6

En Linux, intentaría echar un vistazo a

/proc/<pid>/environ
Joril
fuente
5

Para Solaris 5.10, esto funciona:

pargs -e <PID>
Mykola Novik
fuente
5

Si bien está escasamente documentado, el contenido de /proc/<pid>/environsolo contendrá el entorno que se utilizó para iniciar el proceso.

Si necesita inspeccionar el estado actual del entorno de un proceso, una forma de hacerlo es mediante el uso 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
fuente
3

Y como mi trabajo me hace ser un fanático de AIX, no olvidemos:

ps eww [pid]

O como lo llama la página del manual, "Berkeley Standards".

Por alguna razón, / proc / PID / environment no existe en AIX.

Corey S.
fuente
2

Si desea crear formato envcomo salida de las variables de entorno para un proceso arbitrario (PID), puede crear un penv <pid>comando bash conveniente (adaptado a su sistema operativo) y agregarlo a su .bashrc:

Linux agregue esto a su ~ / .bashrc:

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

macOS / BSD agregue esto a su ~ / .bashrc:

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

Solaris agregue esto a su ~ / .bashrc:

penv() {
   pargs -e $1
}

Uso:

$ fuente $ 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
USUARIO = root
PWD = / root
INICIO = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
CORREO = / var / mail / root
TERM = xterm-256color
SHELL = / bin / bash
SHLVL = 1
LOGNAME = root
DBUS_SESSION_BUS_ADDRESS = unix: ruta = / run / user / 0 / bus
XDG_RUNTIME_DIR = / run / user / 0
RUTA = / root / bin: / bin: / sbin: / usr / bin: / usr / sbin: / usr / local / bin: / usr / local / sbin :.
VBOX_LOG_FLAGS = hilo tsc
VBOX_LOG = -todos + dev_vmm_backdoor.elf + dev_vmm.elf
luz clara
fuente
0

Una solución mac, probablemente otros BSD también podrían ser algo así como

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

Las variables de entorno se agregan a la línea de comando, esto elimina la línea de comando y solo nos quedan las variables de entorno.

No es perfecto porque están separados por espacios no separados por LF

Erik Martino
fuente
-1

/ proc / PID / ambient

para esto, primero debemos identificar el PID del proceso. para esto puedes usar el comando ps

varun
fuente