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

时间:2011-04-14 04:32:04

标签: linux memory memory-management shared

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

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?

5 个答案:

答案 0 :(得分:39)

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

如果两个进程附加的段,假设它们保持连接,您可以从创建者PID ipcs和最后附加的PID cpid找出哪个是两个过程,但不会扩展到两个以上的过程,因此它的用处是有限的。

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

当我在/proc地图上为所有流程执行grep时,我会收到包含procfscpid流程行的条目。

例如,我从lpid获得以下共享内存段:

ipcs -m

并且,从------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 123456 pax 600 1024 2 dest 开始,ipcs -mp为3956,而cpid为该给定共享内存段(123456)为9999。

然后,使用命令lpid,我看到:

grep 123456 /proc/*/maps

所以一种获取附加到它的进程的方法。我很确定/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted) /proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted) 状态和dest指标是因为创建者在最终分离发生后已将该段标记为销毁,而不是已经被销毁。

因此,通过扫描(deleted)“文件”,您应该能够发现当前哪些PID附加到给定的段。

答案 1 :(得分:21)

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

lsof | egrep "98306|COMMAND"

答案 2 :(得分: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

答案 3 :(得分:0)

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

以下是输出图片:

image

答案 4 :(得分:0)

万一某人只对创建共享时刻的过程感兴趣,请致电

ls -l /dev/shm

它列出了与共享内存关联的名称-至少在Ubuntu上。通常这些名字很能说明问题。