列出与共享内存关联的进程

列出与共享内存关联的进程

当我跑步时,ipcs -m我得到以下信息

------ Shared Memory Segments --------
key     shmid      owner  perms  bytes   nattch status
0x00000 38699014   user   700    8125440 2      dest
0x00072 2064391    root   444    1       0
0x00000 38830088   user   700    299112  2      dest
0x00000 38862857   user   700    181720  2      dest
0x00000 38895626   user   700    244776  2      dest
0x00000 38928395   user   700    156816  2      dest

我想要的是获取使用这些共享内存的进程(id)。我怎样才能得到它?

答案1

ipcs -m -p显示 shmid创建它的进程的 PID(“cpid”)。

它还显示了“最后一个运算符”或“lpid” - 我不知道那是什么(手册页没有说明,所以我必须深入研究文档或源代码才能找到答案,这太疯狂了讲话!)。

例如,在我的一个系统上(它恰好运行 postgres 和 apache 等):

$ ipcs -m -p

------ Shared Memory Creator/Last-op PIDs --------
shmid      owner      cpid       lpid      
36         postgres   3155864    2367086   
38         root       14452      2362481   

(apache,pid 14452,与所有者 root 一起显示。它以 root 身份启动,但www-data在它预分叉其他进程时发生变化)。

我们可以使用awk它来提取创建者 PID,并将其通过管道传输到xargs -n 1 pstree -p显示这些 PID 下的 PID 树。

注意:pstree一次最多只能使用一个 PID 参数,因此我们必须使用每个 pidxargs -n 1运行一次。pstree

例如(用于ASCII 输出。如果没有,使用默认的画线字符,pstree -A它在终端上看起来可能会稍微漂亮一些):-A

$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {print $3}' | xargs -n 1  pstree  -A -p
postgres(3155864)-+-postgres(1610942)
                  |-postgres(1620056)
                  |-postgres(1761109)
                  |-postgres(1831225)
                  |-postgres(1931537)
                  |-postgres(2123512)
                  |-postgres(2284745)
                  |-postgres(2386392)
                  |-postgres(3155867)
                  |-postgres(3155868)
                  |-postgres(3155869)
                  |-postgres(3155870)
                  |-postgres(3155871)
                  |-postgres(3155872)
                  `-postgres(3159321)
apache2(14452)-+-apache2(141263)
               |-apache2(762459)
               |-apache2(856005)
               |-apache2(856006)
               |-apache2(856008)
               |-apache2(856009)
               |-apache2(856010)
               |-apache2(856438)
               |-apache2(1369957)
               |-apache2(1777646)
               |-apache2(1887781)
               `-apache2(3746760)

如果需要,可以对其进行后处理(使用 awk 或其他工具)以仅从括号内提取 PID。

顺便说一句,pstree还有各种其他有用的选项(包括-u显示 uid 转换和-a显示完整的命令行)来更改其输出内容及其格式。

如果您需要显示 cpid 和 lpid 的 pstree,请使用以下内容:

$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {printf "%s\n%s\n", $3, $4}' | xargs -n 1 pstree -p

相关内容