如何确定哪个进程附加到共享内存段?
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?
答案 0 :(得分:39)
我认为你不能用标准工具做到这一点。您可以使用ipcs -mp
获取 last 进程的进程ID以进行附加/分离,但我不知道如何使用{获取所有附加进程{1}}。
如果两个进程附加的段,假设它们保持连接,您可以从创建者PID ipcs
和最后附加的PID cpid
找出哪个是两个过程,但不会扩展到两个以上的过程,因此它的用处是有限的。
lpid
方法似乎有限,但我相信有一种方法可以与cat /proc/sysvipc/shm
文件系统的其他部分一起使用,如下所示:
当我在/proc
地图上为所有流程执行grep
时,我会收到包含procfs
和cpid
流程行的条目。
例如,我从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
:它提供了所有资源的详细信息[信号量,共享内存等]
以下是输出图片:
答案 4 :(得分:0)
万一某人只对创建共享时刻的过程感兴趣,请致电
ls -l /dev/shm
它列出了与共享内存关联的名称-至少在Ubuntu上。通常这些名字很能说明问题。