有没有办法查看进程在 Linux 中拥有的所有线程的详细信息?

Laz*_*zer 127 command-line shell process

对于 Windows,我认为Process Explorer 会显示进程下的所有线程。

是否有类似的 Linux 命令行实用程序可以向我显示特定进程产生的所有线程的详细信息?


我想我应该让自己更清楚。我不想看到进程层次结构,而是一个特定进程产生的所有线程的列表

看这个截图

替代文字

如何在 Linux 中实现这一点?谢谢!

Gil*_*il' 134

经典工具top默认显示进程,但可以通过H按键或-H命令行选项告诉显示线程。还有htop,它类似于top但具有滚动和颜色;它默认显示所有线程(但可以关闭)。ps也有一些显示线程的选项,尤其是H-L

还有一些 GUI 工具可以显示有关线程的信息,例如qps(一个简单的 GUI 包装器ps)或conky(具有许多配置选项的系统监视器)。

对于每个进程,进程 ID在/proc/12345哪里可以找到很多信息12345。每个线程的信息是可用的/proc/12345/task/67890地方67890是内核线程ID。这是pstop和其他工具获得信息。

  • @AlexisWilke 小写“h”寻求帮助,大写“H”显示/隐藏线程。 (2认同)

小智 80

列出 Linux 下的线程

当前提供答案

我想明确指出,这里的每个答案都为您提供了您所指定的内容,即与进程关联的所有线程的列表,这可能并不明显,htop因为默认情况下,它列出了系统上的所有线程,不仅仅是过程,而且top -H -p <pid>效果更好,例如:

top - 00:03:29 up 3 days, 14:49,  5 users,  load average: 0.76, 0.33, 0.18
Tasks:  18 total,   0 running,  18 sleeping,   0 stopped,   0 zombie
Cpu(s): 22.6%us,  5.7%sy,  4.2%ni, 66.2%id,  0.8%wa,  0.5%hi,  0.1%si,  0.0%st
Mem:   2063948k total,  1937744k used,   126204k free,   528256k buffers
Swap:  1052220k total,    11628k used,  1040592k free,   539684k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30170 daniel    20   0  371m 140m 107m S 10.0  7.0   0:31.37 source:src
30066 daniel   -90   0  371m 140m 107m S  2.0  7.0   0:07.87 clementine
30046 daniel    20   0  371m 140m 107m S  0.0  7.0   0:32.05 clementine
30049 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30050 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.31 clementine
30051 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30052 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30053 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30054 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.03 clementine
30055 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30056 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30057 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.04 clementine
30058 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30060 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.16 clementine
30061 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30062 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30064 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
30065 daniel    20   0  371m 140m 107m S  0.0  7.0   0:00.00 clementine
Run Code Online (Sandbox Code Playgroud)

作为旁注,线程-90实际上是一个实时线程。

还有另一个选项是真正的 CLI ps -e -T | grep <application name or pid>

  • -e 显示所有进程
  • -T 列出所有线程
  • | 将输出通过管道传输到下一个命令
  • grep 这过滤了内容

下面是一个例子:

$ ps -e -T | grep clementine
  PID  SPID TTY          TIME CMD       # this is here for clarity
30046 30046 pts/2    00:00:17 clementine
30046 30049 pts/2    00:00:00 clementine
30046 30050 pts/2    00:00:00 clementine
30046 30051 pts/2    00:00:00 clementine
30046 30052 pts/2    00:00:00 clementine
30046 30053 pts/2    00:00:00 clementine
30046 30054 pts/2    00:00:00 clementine
30046 30055 pts/2    00:00:00 clementine
30046 30056 pts/2    00:00:00 clementine
30046 30057 pts/2    00:00:00 clementine
30046 30058 pts/2    00:00:00 clementine
30046 30060 pts/2    00:00:00 clementine
30046 30061 pts/2    00:00:00 clementine
30046 30062 pts/2    00:00:00 clementine
30046 30064 pts/2    00:00:00 clementine
30046 30065 pts/2    00:00:00 clementine
30046 30066 pts/2    00:00:03 clementine
Run Code Online (Sandbox Code Playgroud)

每一个都有相同的PID,所以你知道它们在同一个进程中。

  • 请注意,还有 ps -Tp &lt;pid&gt;,因为除非您使它更复杂,否则 grep 有点模糊。 (11认同)
  • 如果你使用 `sed` 而不是 `grep`,你可以用简单的代码保留标题:`ps -e -T | sed -n '1p; /克莱门汀/p;'` (4认同)
  • 谢谢!SPID 代表什么? (3认同)
  • SPID 是令人困惑的线程 ID。 (3认同)
  • 嗨丹尼尔,您可以编辑您的答案并添加[托马斯·塞梅尔的建议](https://unix.stackexchange.com/questions/892/is-there-a-way-to-see-details-of-all-the -threads-that-a-process-has-in-linux#comment4994_1056),即“ps -Tp &lt;pid&gt;”?它快速、简单,并且比 grep(可能有误报)更可靠。 (2认同)

Mic*_*zek 40

htop是 top 的curses 版本,有一个显示选项,用于在树视图中显示每个进程的所有线程。启动htop并按下F5将导致:

htop 的截图


use*_*496 27

您可以尝试使用:

/usr/bin/pstree $PID
Run Code Online (Sandbox Code Playgroud)

例如:

# pstree -p `pidof iceweasel`
iceweasel(3630)???{iceweasel}(3662)
                ??{iceweasel}(3663)
                ??{iceweasel}(3664)
                ??{iceweasel}(3665)
                ??{iceweasel}(3666)
                ??{iceweasel}(3674)
                ??{iceweasel}(3675)
                ??{iceweasel}(3676)
                ??{iceweasel}(3677)
                ??{iceweasel}(3681)
                ??{iceweasel}(3682)
                ...
Run Code Online (Sandbox Code Playgroud)

每个线程都有自己的PID。


Fra*_*iat 16

显示过程信息的两个标准工具是pstop(并且htop是相似的/改进的)。

笔记:

  • 许多程序将线程的明显名称更改为有意义的名称,下面的工具可以显示二进制名称或该明显名称(检查下面示例中的 PID 1086)。
  • 在下面的示例中,我删除了大部分流程以保持答案简短。
  • 下面的命令参数示例是常见的。检查联机帮助页以获取替代选项 ( ps -m, ps m, ps H...)

实时查看所有或进程,使用 top -H

top - 16:24:42 up  3:49,  3 users,  load average: 0.23, 0.29, 0.31
Threads: 503 total,   2 running, 501 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.7 us,  1.6 sy,  0.0 ni, 88.5 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3938668 total,  2148708 used,  1789960 free,   133524 buffers
KiB Swap:  3903484 total,        0 used,  3903484 free.   822904 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1054 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 rsyslogd
 1086 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.03 in:imuxsock
 1087 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.00 in:imklog
 1090 root      20   0  258664   3524   2692 S  0.0  0.1   0:00.05 rs:main Q:Reg
 2452 fpiat     20   0   25292   7520   3580 S  0.0  0.2   0:00.69 bash         
 2495 fpiat     20   0   25088   6988   3256 S  0.0  0.2   0:00.05 bash
Run Code Online (Sandbox Code Playgroud)

所有进程和线程的即时视图,使用 ps -eLf

$ ps -eLf
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root      1054     1  1054  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1086  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1087  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
root      1054     1  1090  0    4 12:34 ?        00:00:00 /usr/sbin/rsyslogd -n
franklin  2452  2448  2452  0    1 12:35 pts/0    00:00:00 /bin/bash
franklin  2495  2448  2495  0    1 12:36 pts/1    00:00:00 /bin/bash
Run Code Online (Sandbox Code Playgroud)

进程的线程信息,使用 ps -T

ps -T -C rsyslogd
  PID  SPID TTY          TIME CMD
 1054  1054 ?        00:00:00 rsyslogd
 1054  1086 ?        00:00:00 in:imuxsock
 1054  1087 ?        00:00:00 in:imklog
 1054  1090 ?        00:00:00 rs:main Q:Reg
Run Code Online (Sandbox Code Playgroud)

(注意:使用任一选项-C command,或-p PID选择进程)

使用自定义来详细说明进程的线程信息 ps

$ ps -L -o pid,lwp,pri,nice,start,stat,bsdtime,cmd,comm  -C rsyslogd
  PID   LWP PRI  NI  STARTED STAT   TIME CMD                         COMMAND
 1054  1054  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rsyslogd
 1054  1086  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imuxsock
 1054  1087  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       in:imklog
 1054  1090  19   0 12:34:53 Ssl    0:00 /usr/sbin/rsyslogd -n       rs:main Q:Reg
Run Code Online (Sandbox Code Playgroud)


Hem*_*ant 9

你可以试试top -H -p <pid>
但请注意某些 Unix 风格的“-H”选项在top命令中不可用。

  • 我敢说没有 UNIX 支持`-H`;Linux 使用 GNU 工具(包括 `ps`)而 UNIX 不使用。(当然,这是一个概括......) (2认同)

Ayu*_*yal 5

ps -H le <pid>
Run Code Online (Sandbox Code Playgroud)

这应将线程显示为进程。还要记住,多线程的所有线程必须具有相同的 PID。Linux 通过创建线程组来实现这一点。第一个线程是组的领导者,其 PID 将是线程组的 tgid(thread groupID)。

您可以使用 /proc 文件系统找出线程的实际 PID 和状态。实现此目的的另一种方法是使用 ps 检查 PID,然后运行以下命令:

cat /proc/pid/status
Run Code Online (Sandbox Code Playgroud)

然后进一步检查线程的 pids/tgid 并运行以下命令:

cat /proc/pid/task/threadid/status
Run Code Online (Sandbox Code Playgroud)