![列出子进程 ID](https://linux22.com/image/1634024/%E5%88%97%E5%87%BA%E5%AD%90%E8%BF%9B%E7%A8%8B%20ID.png)
我想要获取给定父进程 ID () 的所有子进程 ID 的列表,6330 qemu
以便在脚本中使用bash
。
我可以在 中看到它们htop
,例如:
热门搜索结果包括:
# pgrep -P 6330
(no output)
# ps --ppid 6330
PID TTY TIME CMD
# pstree -p 6330
qemu(6330)-+-{qemu}(6332)
|-{qemu}(6333)
|-{qemu}(6340)
|-{qemu}(6342)
|-{qemu}(6343)
`-{qemu}(6344)
root
...如果以或 拥有 的用户身份运行,这些的输出是相同的qemu
。
作为最后的手段,输出pstree
是可行的,但如果可以帮助的话,我宁愿不解析它。
而且...ps aux | grep 6332
并pgrep 6332
没有产生任何东西...所以这也有点令人费解。
这应该很容易吧?
我很感谢您的时间。
答案1
我想要获取给定父进程 ID () 的所有子进程 ID 的列表,
6330 qemu
以便在脚本中使用bash
。
这个确切问题的解决方案是pgrep -P 6330
,但问题的其余部分表明也许“子进程 ID”不是您真正想要的。
您使用了pgrep -P 6330
并且输出为空,因为没有子进程。htop
和pstree
向您展示了什么线程。所以也许你确实想要线程 ID。
看看这些:
-
htop
默认情况下将各个线程显示为单独的进程,类似于如何显示ps -AL
。如果按下大写,H
它将切换为仅显示主进程(再次按下则切换回)。 -
进程的子线程位于父进程下,并以花括号中的进程名称显示[…]
-
Linux 过去常常为线程分配不同的 PID。从 Linux 2.4 开始,进程的线程共享其 PID;这是为了满足 POSIX。术语变得更加复杂,“PID”有些含糊。从SO上的相关答案:
首先也是最重要的一点是,要意识到“PID”在内核空间和用户空间中的含义不同。内核所称的 PID 实际上是内核级线程 ID(通常称为 TID),[…]。系统上的每个线程,无论是在同一个进程中还是在不同的进程中,都有一个唯一的 TID(内核术语中为“PID”)。
另一方面,POSIX 中“进程”含义中的 PID 在内核中被称为“线程组 ID”或“TGID”。每个进程由一个或多个线程(内核进程)组成,每个线程都有自己的 TID(内核 PID),但所有线程共享同一个 TGID,该 TGID 等于主进程运行的初始线程的 TID(内核 PID)。
当
top
显示线程时,它显示的是 TID(内核 PID),而不是 PID(内核 TGID),这就是为什么每个线程都有一个单独的 PID。最后一句话也适用于
htop
或。pstree
如果您仍想获取这些不同的 ID(6332
,,6333
...)以在 Shell 脚本中使用,请调用以下命令:
ps -o lwp= -Lp 6330
该命令不可移植,它可能在您的操作系统中有效,也可能无效。如果它有效,您可能需要排除主线程:
ps -o lwp= -Lp 6330 | grep -v '^ *6330$'
(<space>*
因为ps
(至少我的ps
)添加了前导空格)。