GNU/Linux >> Linux Esercitazione >  >> Linux

Come elencare i processi collegati a un segmento di memoria condivisa in Linux?

Nel caso in cui qualcuno sia interessato solo al tipo di processo che ha creato le moerie condivise, chiama

ls -l /dev/shm

Elenca i nomi associati ai ricordi condivisi, almeno su Ubuntu. Di solito i nomi sono abbastanza eloquenti.


Non penso che tu possa farlo con gli strumenti standard. Puoi usare ipcs -mp per ottenere l'ID processo dell'ultimo processo per allegare/scollegare ma non sono a conoscenza di come ottenere tutto processi collegati con ipcs .

Con un segmento associato a due processi, supponendo che entrambi rimangano allegato, puoi eventualmente capire dal creatore PID cpid e PID ultimo allegato lpid quali sono i due processi ma che non si ridurrà a più di due processi quindi la sua utilità è limitata.

Il cat /proc/sysvipc/shm metodo sembra similmente limitato ma credo che ci sia un modo per farlo con altre parti del /proc filesystem, come mostrato di seguito:

Quando eseguo un grep sul procfs maps per tutti i processi, ottengo voci contenenti righe per cpid e lpid processi.

Ad esempio, ottengo il seguente segmento di memoria condivisa da ipcs -m :

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

e, da ipcs -mp , il cpid è 3956 e lpid è 9999 per quel dato segmento di memoria condivisa (123456).

Quindi, con il comando grep 123456 /proc/*/maps , vedo:

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)

Quindi c'è un modo per ottenere i processi ad esso collegati. Sono abbastanza sicuro che il file dest stato e (deleted) l'indicatore è dovuto al fatto che il creatore ha contrassegnato il segmento per la distruzione una volta avvenuto il distacco finale, non che sia già stato distrutto.

Quindi, scansionando il file /proc/*/maps "files", dovresti essere in grado di scoprire quali PID sono attualmente collegati a un dato segmento.


Ho scritto uno strumento chiamato who_attach_shm.pl, analizza /proc/[pid]/maps per ottenere le informazioni. Puoi scaricarlo da github

output di esempio:

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

dato il tuo esempio sopra - per trovare i processi collegati a shmid 98306

lsof | egrep "98306|COMMAND"

Linux
  1. Come cancellare la cache di memoria in Linux

  2. Come posso ottenere un elenco di reti wireless disponibili su Linux?

  3. Come utilizzare la memoria condivisa con Linux in C

  4. Come ricevo la notifica degli errori ECC in Linux?

  5. In che modo Linux alloca la larghezza di banda tra i processi?

Come elencare i pacchetti installati in Linux

Come elencare le partizioni del disco in Linux

Come cancellare la memoria di scambio in Linux

Come elencare le librerie condivise utilizzate dagli eseguibili in Linux

Come ottenere l'elenco degli account utente MySQL in Linux

Come ottenere un elenco di collegamenti simbolici su Linux