2011-04-14 9 views
30

¿Cómo puedo determinar qué proceso está conectado a un segmento de memoria compartida?¿Cómo enumerar los procesos conectados a un segmento de memoria compartida en Linux?

[email protected]:/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 puedo saber qué dos procesos están asociados a shmid 98306?

Respuesta

32

No creo que pueda hacer esto con las herramientas estándar. Puede usar ipcs -mp para obtener el proceso de identificación del último proceso para adjuntar/separar pero no conozco cómo obtener todos los procesos adjuntos con ipcs.

con un segmento de los dos procesos inscritos, suponiendo que ambos quedaron unidos, posiblemente puede averiguar el creador de PID cpid y última adjunta PID lpid que son los dos procesos, pero eso no va a escalar a más de dos procesos por lo que su utilidad es limitada.

El método cat /proc/sysvipc/shm 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 los procfs mapas para todos los procesos, consigo entradas que contienen líneas para los procesos cpid y lpid.

Por ejemplo, consigo el segmento de memoria compartida siguiente de ipcs -m:

------ Shared Memory Segments -------- 
key  shmid  owner  perms  bytes  nattch  status  
0x00000000 123456  pax  600  1024  2   dest 

y, desde ipcs -mp, la cpid es 3956 y la lpid es 9,999 para ese segmento de memoria compartida dada (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) 

Así que no es una manera de conseguir que los procesos para su concesión. Estoy bastante seguro de que el estado dest y el indicador (deleted) se 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 /proc/*/maps "archivos", debe poder descubrir qué PID están actualmente conectados a un segmento determinado.

+0

Unix semántica permite eliminar te archivos/objetos que todavía están en uso. Eso significa que puede eliminar archivos que aún están abiertos. Entonces, el nombre del archivo se borra pero el objeto del archivo aún está allí, una vez que se cierra el último identificador de archivo, ya no hay más referencia al archivo y se elimina. Lo mismo ocurre con los objetos de memoria compartida en estado "(eliminado)". Esos todavía están allí pero ya no son accesibles desde nuevos procesos. – hurikhan77

19

dado su ejemplo anterior - para encontrar los procesos vinculados a shmid 98306

lsof | egrep "98306|COMMAND" 
0

escribí una herramienta llamada who_attach_shm.pl, analiza/proc/PID] [/ mapas para obtener la información. se puede descargar desde la salida github

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 
+1

Estimado Jacuro, proporcione la solución en este foro. El problema con los enlaces es que podrían desaparecer por varios motivos. – Trinimon

+0

@Trinimon, lo obtuve, voy a proporcionar un enlace para descargar el script en su lugar. – jacuro

+1

-1 por no proporcionar la solución en la respuesta después de que se le diga por qué es importante – scraimer

1

Uso ipcs -a: da información detallada de todos los recursos [semáforos, memoria compartida, etc]

Aquí está la imagen de salida -

click here to open image

+0

Puede copiar los contenidos de las imágenes a su respuesta. – dakab

+0

sí, si el puntaje de reputación es> 10 –

+3

Quise decir que podría copiar el contenido * text *, que no requiere ninguna reputación. Es una captura de pantalla de contenido solo de texto. Podrías ponerlo en un bloque de código/cita. – dakab

Cuestiones relacionadas