linux - sistemas - shmget
¿Cómo se enumeran los procesos asociados a un segmento de memoria compartida en Linux? (4)
¿Cómo determino qué proceso está conectado a un segmento de memoria compartida?
awagner@tree:/home/awagner$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 root 777 102400 1
0x00000000 32769 root 774 96 1 dest
0x00000000 98306 awagner 600 393216 2 dest
0x00000000 131075 awagner 600 393216 2 dest
es decir, ¿cómo averiguo qué dos procesos están asociados a shmid 98306?
Escribí una herramienta llamada who_attach_shm.pl, analiza / proc / [pid] / maps para obtener la información. puedes descargarlo desde github
muestra de salida:
shm attach process list, group by shm key
##################################################################
0x2d5feab4: /home/curu/mem_dumper /home/curu/playd
0x4e47fc6c: /home/curu/playd
0x77da6cfe: /home/curu/mem_dumper /home/curu/playd /home/curu/scand
##################################################################
process shm usage
##################################################################
/home/curu/mem_dumper [2]: 0x2d5feab4 0x77da6cfe
/home/curu/playd [3]: 0x2d5feab4 0x4e47fc6c 0x77da6cfe
/home/curu/scand [1]: 0x77da6cfe
No creo que puedas hacer esto con las herramientas estándar. Puede usar ipcs -mp
para obtener la identificación del proceso del último proceso para adjuntar / desconectar, pero no conozco cómo obtener todos los procesos adjuntos con ipcs
.
Con un segmento adjunto a dos procesos, suponiendo que ambos permanezcan conectados, posiblemente se pueda deducir del creador PID cpid
y del último adjunto PID lpid
que son los dos procesos pero que no se escalarán a más de dos procesos, por lo que su utilidad está limitado.
El método cat /proc/sysvipc/shm
parece igualmente limitado, pero creo que hay una manera de hacerlo con otras partes del sistema de archivos /proc
, como se muestra a continuación:
Cuando hago un grep
en los mapas de procfs
para todos los procesos, obtengo entradas que contienen líneas para los procesos cpid
y lpid
.
Por ejemplo, obtengo el siguiente segmento de memoria compartida de ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
y, desde ipcs -mp
, el cpid
es 3956 y el lpid
es 9999 para ese segmento de memoria compartida dado (123456).
Luego, con el comando grep 123456 /proc/*/maps
, veo:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Entonces hay una manera de obtener los procesos que se le atribuyen. Estoy bastante seguro de que el estado del dest
y el indicador (deleted)
deben a que el creador ha marcado el segmento para su destrucción una vez que se produce el desprendimiento final, no es que ya haya sido destruido.
Por lo tanto, al escanear los "archivos" de /proc/*/maps
, debe poder descubrir qué PID están actualmente conectados a un segmento determinado.
Use ipcs -a : proporciona información detallada de todos los recursos [semáforo, memoria compartida, etc.]
Aquí está la imagen de salida -
dado su ejemplo anterior - para encontrar procesos adjuntos a shmid 98306
lsof | egrep "98306|COMMAND"