GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo enumerar los procesos adjuntos a un segmento de memoria compartida en Linux?

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"

Linux
  1. Cómo borrar la caché de memoria en Linux

  2. ¿Cómo puedo obtener una lista de redes inalámbricas disponibles en Linux?

  3. Cómo usar la memoria compartida con Linux en C

  4. ¿Cómo me notifican los errores de ECC en Linux?

  5. ¿Cómo asigna Linux el ancho de banda entre los procesos?

Cómo enumerar los paquetes instalados en Linux

Cómo enumerar particiones de disco en Linux

Cómo borrar la memoria de intercambio en Linux

Cómo enumerar las bibliotecas compartidas utilizadas por los ejecutables en Linux

Cómo obtener la lista de cuentas de usuario de MySQL en Linux

Cómo obtener una lista de enlaces simbólicos en Linux