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

问题描述 投票:37回答:4

如何确定哪个进程附加到共享内存段?

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?

linux memory memory-management shared
4个回答
40
投票

我认为你不能用标准工具做到这一点。您可以使用ipcs -mp获取最后一个进程附加/分离进程的进程ID,但我不知道如何使用ipcs获取所有附加进程。

假设两个过程相关的段,假设它们都保持连接,你可以从创建者PID cpid和最后附加的PID lpid中找出这两个过程但是不能扩展到两个以上的过程因此它的用处是有限的。

cat /proc/sysvipc/shm方法似乎有限,但我相信有一种方法可以与/proc文件系统的其他部分一起使用,如下所示:

当我在grep地图上为所有进程执行procfs时,我得到的条目包含cpidlpid进程的行。

例如,我从ipcs -m获得以下共享内存段:

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

并且,从ipcs -mpcpid是3956,而lpid是9999,给定共享内存段(123456)。

然后,使用命令grep 123456 /proc/*/maps,我看到:

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

因此,有一种方法可以获得附加到它的进程。我很确定dest状态和(deleted)指标是因为一旦最终分离发生,创建者已将该段标记为破坏,而不是它已经被破坏。

因此,通过扫描/proc/*/maps“文件”,您应该能够发现当前附加到给定段的PID。


21
投票

给出上面的例子 - 找到附加到shmid 98306的进程

lsof | egrep "98306|COMMAND"

1
投票

我写了一个名为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

0
投票

使用ipcs -a:它提供了所有资源的详细信息[信号量,共享内存等]

这是输出的图像:

© www.soinside.com 2019 - 2024. All rights reserved.