列出子进程 ID

列出子进程 ID

我想要获取给定父进程 ID () 的所有子进程 ID 的列表,6330 qemu以便在脚本中使用bash

我可以在 中看到它们htop,例如:

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 6332pgrep 6332没有产生任何东西...所以这也有点令人费解。

这应该很容易吧?

我很感谢您的时间。

答案1

我想要获取给定父进程 ID () 的所有子进程 ID 的列表,6330 qemu以便在脚本中使用bash

这个确切问题的解决方案是pgrep -P 6330,但问题的其余部分表明也许“子进程 ID”不是您真正想要的。

您使用了pgrep -P 6330并且输出为空,因为没有子进程。htoppstree向您展示了什么线程。所以也许你确实想要线程 ID。

看看这些:

  • 为什么在 中同一标题下列出了许多流程htop

    htop默认情况下将各个线程显示为单独的进程,类似于如何显示ps -AL。如果按下大写,H它将切换为仅显示主进程(再次按下则切换回)。

  • man 1 pstree

    进程的子线程位于父进程下,并以花括号中的进程名称显示[…]

  • 在 Linux 上线程是作为进程实现的吗?

    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)添加了前导空格)。

相关内容