Pro případ, že by někoho zajímalo pouze to, jaký proces vytvořil sdílené moeries, zavolejte
ls -l /dev/shm
Uvádí jména, která jsou spojena se sdílenými vzpomínkami - alespoň na Ubuntu. Obvykle jsou jména docela výmluvná.
Nemyslím si, že to můžete udělat se standardními nástroji. Můžete použít ipcs -mp
získat ID procesu posledního proces připojit/odpojit, ale nevím, jak získat vše připojené procesy s ipcs
.
Se segmentem připojeným ke dvěma procesům, za předpokladu, že oba zůstali přiloženo, můžete případně zjistit z PID tvůrce cpid
a naposledy připojený PID lpid
což jsou dva procesy, které se však neškálují na více než dva procesy, takže jeho užitečnost je omezená.
cat /proc/sysvipc/shm
metoda se zdá podobně omezená, ale věřím, že existuje způsob, jak to udělat s jinými částmi /proc
souborový systém, jak je uvedeno níže:
Když udělám grep
na procfs
map pro všechny procesy, dostávám záznamy obsahující řádky pro cpid
a lpid
procesy.
Například dostanu následující segment sdílené paměti z ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
a od ipcs -mp
, cpid
je 3956 a lpid
je 9999 pro daný segment sdílené paměti (123456).
Poté pomocí příkazu grep 123456 /proc/*/maps
, vidím:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Takže existuje způsob, jak získat procesy, které jsou k němu připojeny. Jsem si docela jistý, že dest
stav a (deleted)
Indikátory jsou proto, že tvůrce označil segment ke zničení, jakmile dojde ke konečnému odpojení, nikoli že již byl zničen.
Takže skenováním /proc/*/maps
"files", měli byste být schopni zjistit, které PID jsou aktuálně připojeny k danému segmentu.
Napsal jsem nástroj nazvaný who_attach_shm.pl, analyzuje /proc/[pid]/maps, aby získal informace. Můžete si jej stáhnout z github
ukázkový výstup:
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
vzhledem k vašemu příkladu výše - najít procesy připojené k shmid 98306
lsof | egrep "98306|COMMAND"