当我跑步时,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