En caso de que alguien esté interesado solo en qué tipo de proceso creó los recuerdos compartidos, llame
ls -l /dev/shm
Enumera los nombres asociados con las memorias compartidas, al menos en Ubuntu. Por lo general, los nombres son bastante reveladores.
No creo que puedas hacer esto con las herramientas estándar. Puedes usar ipcs -mp
para obtener el ID de proceso del último proceso para adjuntar/desconectar pero no sé cómo obtener todos procesos adjuntos con ipcs
.
Con un segmento adjunto de dos procesos, asumiendo que ambos se quedaron adjunto, es posible que pueda averiguarlo a partir del PID del creador cpid
y último PID adjunto lpid
cuáles son los dos procesos, pero eso no escalará a más de dos procesos, por lo que su utilidad es limitada.
El cat /proc/sysvipc/shm
El método parece igualmente limitado, pero creo que hay una manera de hacerlo con otras partes del /proc
sistema de archivos, como se muestra a continuación:
Cuando hago un grep
en el procfs
mapas para todos los procesos, obtengo entradas que contienen líneas para el cpid
y lpid
procesos.
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 forma de obtener los procesos que se le atribuyen. Estoy bastante seguro de que el dest
estado y (deleted)
son porque el creador ha marcado el segmento para su destrucción una vez que se produce la separación final, no porque ya se haya destruido.
Entonces, escaneando el /proc/*/maps
"archivos", debería poder descubrir qué PID están adjuntos actualmente a un segmento determinado.
Escribí una herramienta llamada who_attach_shm.pl, analiza /proc/[pid]/maps para obtener la información. Puedes descargarla desde github
salida de muestra:
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
dado su ejemplo anterior, para encontrar procesos adjuntos a shmid 98306
lsof | egrep "98306|COMMAND"