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

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

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

请参见此屏幕截图



在Linux中如何实现?谢谢!

评论

stackoverflow.com/questions/268680/…

#1 楼

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

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

对于每个进程,/proc/12345中提供了大量信息,其中12345是进程ID。有关每个线程的信息,请参见/proc/12345/task/67890,其中67890是内核线程ID。这是pstop和其他工具获取其信息的地方。

评论


我的htop似乎没有显示线程。他们提到H键是在显示和隐藏线程之间交换的一种方式,但是它仍然可以用作Help键...

– Alexis Wilke
19年8月10日在4:39

@AlexisWilke小写字母h寻求帮助,大写字母H展示/隐藏线程。

–吉尔斯'所以-不再是邪恶的'
19年8月10日在7:46

#2 楼

列出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


作为一个侧面说明,带有-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


每个都具有相同的PID,因此您知道它们在相同的位置过程。

评论


谢谢! SPID代表什么?

–激光
10年8月24日在6:06

请注意,还有ps -Tp ,因为grep有点模糊,除非您使其变得更复杂。

–托马斯·塞梅尔(Thomas Themel)
2010-11-28 5:58

如果使用sed而不是grep,则可以使用简单的代码保留标题:ps -e -T | sed -n'1p; / clementine / p;'

–美
2012年2月16日15:25

@Lazer很难说它代表什么,但是man top说它是LWP和TID的别名,而LWP =轻量级进程,而TID =线程标识符。

– Hi-Angel
17年8月3日在18:19

SPID是令人困惑的线程ID。

– CMCDragonkai
18-09-17在3:32

#3 楼

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



#4 楼

您可以尝试使用:

/usr/bin/pstree $PID


例如:

# 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)
                ...


每个线程都有自己的PID。

评论


每个进程都有其自己的进程ID(pid)。 pstree不会向您显示进程内的线程

– bjelli
18年7月1日在7:32



#5 楼

显示过程信息的两个标准工具是pstop(以及类似/改进的htop)。

注意:


许多程序更改了外观名称对于有意义的线程,下面的工具可以显示二进制名称或该明显的名称(在下面的示例中检查PID 1086)。
在下面的示例中,我删除了大多数过程以使答案简短。
下面的命令参数示例很常见。查看手册页中的其他选项(ps -mps mps 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


使用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


使用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


/>(请注意:使用选项-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

详细说明进程的线程信息

评论


SPID是什么意思?

–费罗
19年6月16日在6:08

man7.org/linux/man-pages/man1/ps.1.html说它们是带lwp和tid的同义词。我怀疑SPID表示服务器或会话进程ID。

–slm♦
19-10-26在3:10

#6 楼

您可以尝试使用top -H -p <pid>
,但请注意,某些Unix风格的'-H'选项在top命令中不可用。

评论


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

–美
2012年2月16日15:26

“ top -H -p ”能够执行我想要的操作。谢谢!

–黄永棠
2014年12月3日21:39

#7 楼

ps -H le <pid>


这会将线程显示为进程。
还请记住,多线程的所有线程必须具有相同的PID。 Linux通过创建线程组来做到这一点。第一个线程是线程组的领导者,其PID将是线程组的tgid(线程组ID)。

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

cat /proc/pid/status


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

cat /proc/pid/task/threadid/status


#8 楼

top -H -p <process_id>


这将列出与进程关联的线程(即process_id)[在Ubuntu上使用。选项-H在某些linux版本中可能不可用]

#9 楼

ps huH  -p  pid | wc  -l 


如果显示Java进程,则上述命令显示特定进程pid的运行线程数

#10 楼

我一直在寻找相同的东西,并且能够提出以下bash脚本,
这仍在进行中,我将在改进脚本时对其进行更新。
我不是unix专家,我相信有些专家可以用更好的质量写成两行,但是我的目的是为其他人提供可行的解决方案。

使用过滤器和过程信息进行更新

#!/bin/bash

ps -ef --no-headers | while read line; do                 # for each process read the info (without headers)
   IFS='        ' read -r -a array <<< "$line"             # split info into array
   psResultStr="ps -p ${array[1]} -lfT |  wc -c"           # count how many threads per PID
   numThreads=$(eval $psResultStr)                         # trying to convert it to number so i can filter later
   if [ "$numThreads" -gt "1000" ]                          #only show process with 1K or more
   then
        printf "Number of threads for PID:${array[1]} Has $numThreads Threads.  Process info: "
              for ((i = 7; i < ${#array[@]}; ++i)); do       #Process info starts at idx 7
                                position=$(( $i + 1 ))  # bash arrays are 0-indexed
                                lineText=$(echo ${array[$i]}|tr -d '\n')   # remove any new lines
                                printf "%s" "$lineText"                     #output line item
                        done
                        printf "\n\n"
   fi
done