如何在Linux中列出附加到共享内存段的进程?

| 如何确定共享内存段上附加了什么进程?
awagner@tree:/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    
即我如何确定shmid 98306附加了哪些两个进程?     
已邀请:
我认为您无法使用标准工具来做到这一点。您可以使用
ipcs -mp
获取要附加/分离的最后一个进程的进程ID,但是我不知道如何使用
ipcs
获得所有附加的进程。 对于有两个进程的段,假设它们都保持连接,则可以从创建者PID
cpid
和最后一个附加的PID
lpid
中找出这两个进程,但是它们不会扩展到两个以上的进程,因此有用性有限。
cat /proc/sysvipc/shm
方法似乎受到类似的限制,但我相信有一种方法可以对
/proc
文件系统的其他部分进行处理,如下所示: 当我在所有进程的
procfs
映射上执行ѭ7,时,会得到包含
cpid
lpid
进程行的条目。 例如,我从
ipcs -m
获取以下共享内存段:
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest
对于给定的共享内存段(123456),从
ipcs -mp
开始,
cpid
为3956,and4ѭ为9999。 然后,使用命令
grep 123456 /proc/*/maps
,我看到:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
因此,有一种方法可以获取附加的流程。我可以肯定的是ѭ18and状态和
(deleted)
指示符是因为创建者已将片段标记为要在最终分离发生后销毁,而不是已经将其销毁。 因此,通过扫描
/proc/*/maps
\“ files \”,您应该能够发现当前将哪些PID附加到给定段。     
上面给出了您的示例-查找shmid 98306附带的进程
lsof | egrep \"98306|COMMAND\"
    
我编写了一个名为who_attach_shm.pl的工具,该工具解析/ proc / [pid] / maps以获取信息。 您可以从github下载它 样本输出:
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
    
使用
ipcs -a
:它提供所有资源的详细信息[信号灯,共享内存等] 这是输出的图像:     
万一某人只对创建共享时刻的过程感兴趣,请致电
ls -l /dev/shm
它列出了与共享内存关联的名称-至少在Ubuntu上。通常这些名字很能说明问题。     

要回复问题请先登录注册