variable usuario una restaurar permanentes hat entorno ejemplo crear agregar linux perl solaris environment-variables root

usuario - ¿Hay alguna manera de leer variables de entorno de otros procesos que usan Perl y en un entorno Linux o Solaris?



variables de entorno de usuario linux (6)

En Linux, parece que /proc/<pid>/environ psuedofiles contienen la variable de entorno pasada cuando se creó el proceso. Si tiene suficiente permiso, puede leerlos.

No parecen seguir los cambios en el entorno de procesos después del lanzamiento.

Eso sugiere que tendrías que diseñar el volcado de memoria de procesos para obtener lo que estás pidiendo.

Difícil.

En Perl, necesito leer el entorno de otros procesos.

  • La secuencia de comandos se ejecuta con privilegios de administrador.
  • El script se ejecutará tanto en Linux como en Solaris.
  • Me gustaría una solución que sea en su mayoría agnóstica de plataforma, al menos entre Linux y Solaris. En Linux, examinar el / env / <proc_id> / environ me puede dar la respuesta.
  • Me gustaría evitar tener que bifurcar. Ya tengo una solución de bifurcación "/ usr / ucb / ps -auxwwwe $ pid"

¿Algunas ideas?


Lo primero que me viene a la mente es usar GDB para adjuntarlo al proceso en cuestión, y luego pedirle a GDB que obtenga el medio ambiente para usted. Puede hacer esto con el comando "show environment" en el shell GDB.

Parece que hay un módulo Perl que puede hacer esto por usted, Devel :: GDB . Todavía no lo he probado, pero parece una Materia Simple de Programación para crear el objeto Devel :: GDB, conectarse al proceso que desea inspeccionar, enviar el comando "mostrar entorno" y luego analizar los resultados.

Sin embargo, debo decir que ... cuando la solución es tan complicada, probablemente estés haciendo algo diferente. ¿Por qué necesitas el entorno para un proceso aleatorio, de todos modos?


Si ps puede hacerlo, como dices, entonces tu respuesta se puede encontrar en algún lugar del código fuente de ps. Eso evitaría el engendro de un nuevo proceso.


Para Solaris, puede probar el módulo procfs desde CPAN . Aunque este módulo todavía parece bastante joven, esta cita suena esperanzadora:

Brian Farrell envió un parche muy útil que maneja la inspección de argv y el entorno de los procesos que no sean el que se está ejecutando actualmente.

Me imagino que probablemente este sea solo el entorno inicial (como el archivo environ en Linux), pero parece ser lo que quieres.

De lo contrario, aunque veo que dices que no quieres bifurcar, una solución simple sería probablemente generar ~ 20 líneas de C para producir un pequeño programa que simplemente escupe el entorno en Solaris como el equivalente exacto del archivo de entorno Linux. Tengo algo muy similar en C ya. Si estás interesado, puedo publicarlo.

EDITAR (después de leer OpenSolaris pargs.c): el búfer de entorno se reasigna en Solaris cuando el entorno cambia, por lo que el puntero psinfo puede no ser válido. Para una solución a prueba de balas, debes buscar a _environ. Probablemente todo sea más complicado de lo que necesita ... pargs -e <pid> podría ser una pargs -e <pid> más agradable a UCB ps(1) si va por la ruta de la bifurcación.


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


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

strings /proc/pid/environ - imprime una buena lista de variables de entorno muy similar a env .