¿Hay una manera de leer las variables de entorno de otros procesos que utilizan Perl y en un entorno Linux o Solaris?

StackOverflow https://stackoverflow.com/questions/518803

Pregunta

En Perl, necesito leer el medio ambiente de otros procesos.

  • El script se está ejecutando con la raíz privilegios.
  • El guión será que se ejecuta en Linux y Solaris.
  • Me gustaría una solución que es mayormente independiente de la plataforma, por lo menos entre Linux y Solaris. En Linux, el examen de la / env / / environ me pueda obtener la respuesta.
  • Me gustaría no tener que tenedor. Ya tengo una solución que se bifurcan "/ usr / ucb / ps -auxwwwe $ pid"

¿Alguna idea?

¿Fue útil?

Solución

Para Solaris, puede probar con el procfs módulo de CPAN . A pesar de que este módulo aún parece muy joven, esta cita suena esperanzador:

  

Brian Farrell envió un parche muy útil que maneja   la inspección de argv y el medio ambiente de los procesos   que no sea el proceso en ejecución.

Me imagino que esto es probablemente sólo el entorno inicial (al igual que el environ archivos con Linux), pero que parece ser lo que quieres?

De lo contrario, aunque veo que decir que no quiere tenedor, una solución sencilla sería, probablemente, a la manivela ~ 20 líneas de C para producir un pequeño programa que acaba escupe el medio ambiente en Solaris como el equivalente exacto de la Linux pargs -e <pid> archivo. Tengo algo muy similar en C ya. Si está interesado, puedo publicarlo.

Edit (después de leer OpenSolaris pargs.c): El buffer ambiente se reasigna bajo Solaris cuando el entorno cambia, por lo que el puntero psinfo pueden no ser válidas. Para una solución a prueba de balas, lo que necesita para cazar a _environ. Eso es todo, probablemente, más problemas de lo que necesita ... ps(1) podría ser una alterativa más agradable a UCB <=> si lo hace ir a la ruta tenedor, sin embargo.

Otros consejos

En Linux parece que el /proc/<pid>/environ psuedofiles contienen la variable ambiental pasado cuando se creó el proceso. Si tiene permisos suficientes, se puede leer esos.

No aparecen para rastrear cambios en el entorno de los procesos después de su lanzamiento.

Esto sugiere que usted tendría que disect el volcado de memoria los procesos para conseguir lo que estás pidiendo.

Tricky.

paquete 'binutils' El GNU incluye una utilidad llamada CLI strings. Ver http://www.gnu.org/software/binutils/ para obtener más información.

strings /proc/pid/environ - Imprime una buena lista de las variables de entorno tanto como env.

La primera cosa que viene a mi mente está usando GDB para insertarse en el proceso en cuestión y, a continuación, pedir a BGF para obtener el medio ambiente para las tú. Usted puede hacer esto con el comando "show de medio ambiente" en el BGF shell.

Parece que hay un módulo de Perl que puede hacer esto para usted, Devel :: BGF . yo no he probado todavía, pero parece que una simple cuestión de programación de crear el objeto Devel :: BGF, conectar con el proceso que desea inspeccionar, enviar el comando "show de medio ambiente", y luego analizar el resultados.

Lo que tengo que decir sin embargo ... cuando la solución es tan complicado, que probablemente están haciendo otra cosa equivocada. ¿Por qué necesita el ambiente para un proceso aleatorio, de todos modos?

Si ps puede hacerlo, como usted dice, entonces su respuesta se puede encontrar en alguna parte del código fuente de Ps. Con ello se evitaría el desove de un nuevo proceso.

En Linux puede ser suficiente para resolver el /proc/[pid]/cwd enlace simbólico, ver procfs (5) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top