如何确定哪个进程附加到共享内存段?
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
文件系统的其他部分一起使用,如下所示:
当我在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
,cpid
是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。
给出上面的例子 - 找到附加到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
:它提供了所有资源的详细信息[信号量,共享内存等]
这是输出的图像: