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。这是ps,top和其他工具获得信息。
小智 80
我想明确指出,这里的每个答案都为您提供了您所指定的内容,即与进程关联的所有线程的列表,这可能并不明显,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,所以你知道它们在同一个进程中。
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
显示过程信息的两个标准工具是ps和top(并且htop是相似的/改进的)。
笔记:
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)
你可以试试top -H -p <pid>。
但请注意某些 Unix 风格的“-H”选项在top命令中不可用。
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)