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


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 en particular y ver los valores de cada variable de entorno.

¿Cómo puedo lograr lo mismo en Unix? echoing y env cmd solo muestra los valores en el momento actual, pero quiero ver qué valores está usando el proceso en ejecución actualmente.


200
2017-09-17 18:14


origen


Aunque / proc / <pid> / environ tiene un tamaño de 0, todavía hay información allí. "Tiene más sentido si lo considera como una ventana hacia el kernel. El archivo no contiene ningún dato; simplemente actúa como un puntero hacia donde reside la información del proceso real". [fuente] - nevets1219


Respuestas:


cat /proc/<pid>/environ

Si desea tener pid (s) de un ejecutable en ejecución dado, puede, entre otras muchas posibilidades, usar pidof:

AlberT$ pidof sshd   
30690 6512 

EDITAR:

Cito totalmente el comentario de @Teddy para lograr una salida más legible:

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

257
2017-09-17 18:18



Para hacerlo legible, convierta los nulos a nuevas líneas: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
Siempre hago xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
Mejor uso de cuerdas, es rápido. El gato sigue siendo más rápido :-) - Nikhil Mulley
El conjunto /proc El sistema de archivos no es portátil. - Daniel H
No entiendo porque usar xargs convertir nulos a nuevas líneas es mejor que usar tr. ¿Alguien me lo puede poner? Gracias. - Jonathan Hartley


Dado que esta pregunta tiene una Unix etiqueta y todos los demás han hecho un gran trabajo de dirección linux puede obtener esta información sobre OS X y otros sistemas derivados de BSD usando

ps -p <PID> -wwwe

o

ps -p <PID> -wwwE

y en Solaris con

/usr/ucb/ps -wwwe <PID>

Solaris también soporta el /proc directorio si no quieres recordar lo oscuro ps comando


52
2017-09-17 20:47



Yo corro ps -p <PID> -wwwe en OS X 10.6 obtengo la lista de todos los procesos en ejecución. el comando correcto es con -MI bandera, no -e. - drAlberT
He probado en OS X 10.4, pero no 10.5. Actualizado en consecuencia. - Gerald Combs
Esto no es perfecto. La opción -E solo reporta el inicial Variables de entorno. Si el proceso en ejecución ha cambiado las variables (por ejemplo, mediante el uso de la función putenv () POSIX), los cambios no se reflejan en la salida de ps -p <PID> -wwE. - Kal
No ver las variables env de los procesos que no le pertenecen, suena como una característica deseable. También es el caso de la respuesta orientada a Linux de @ drAlberT usando /proc/PID/environ. Esos archivos solo son legibles por el propietario del proceso. - Jonathan Hartley
@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


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

En primer lugar, el archivo environ contiene el entorno tal como se veía cuando se generó el proceso. Eso significa que cualquier cambio que el proceso pueda haber hecho 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 y, inicialmente, tiene un entorno muy limitado, pero lo aumenta mediante el suministro, 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 los kernels anteriores, el contenido del archivo environ 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) se eliminó este límite ...


24
2017-10-29 11:27



¿Es posible obtener las variables de entorno de un proceso remoto que se establecieron después de que se generó el proceso? Entiendo que en VFS, se muestra con / proc / self / environ pero solo si estamos dentro del proceso. Pero, ¿cómo conseguir esto para un proceso remoto? - Jeevan Patnaik


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)


10
2018-03-04 12:15



Mi Ubuntu rompe las variables de entorno directamente contra la línea de comando, sin siquiera un espacio entre ellas, y también se trunca en una línea en la ventana del terminal. encontré ps eww $pid Soluciona el segundo problema. - user18911
@ user18911: las variables env tienen un separador de caracteres nulos. Otras respuestas en esta página muestran formas de uso xargs o tr para convertir estos en nuevas líneas para la legibilidad. Probablemente te diste cuenta de esto en los cuatro años intermedios. - Jonathan Hartley


cat /proc/PID/environ

Reemplace el PID con el PID del proceso que desea ver. Toda la información sobre un proceso en ejecución está en el directorio / proc / PID /

Ejemplo: cat / proc / 32512 / environ


7
2017-09-17 18:19





Bajo Linux, intentaría echar un vistazo a

/proc/<pid>/environ

6
2017-09-17 18:19





Tomado de la Archlinux wiki:

Puede crear una función temporal para analizar los valores en /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>

6
2018-01-13 23:05





Para Solaris 5.10, esto funciona:

pargs -e <PID>

4
2017-08-08 10:04





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

ps eww [pid]

O como la página de manual lo llama "Estándares de Berkeley".

Por cualquier motivo, / proc / PID / environ no existe en AIX.


3
2018-01-19 15:03





Aunque está poco documentado, el contenido de /proc/<pid>/environ solo 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 utilizando 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
2018-02-13 16:22