是否有用于Linux的类似命令行实用程序,可以向我显示有关特定进程产生的所有线程的详细信息? />
我想我应该让自己更加清楚。我不想看到进程层次结构,而是一个特定进程产生的所有线程的列表。
请参见此屏幕截图
在Linux中如何实现?谢谢!
#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。这是ps
,top
和其他工具获取其信息的地方。评论
我的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
–托马斯·塞梅尔(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 楼
显示过程信息的两个标准工具是ps
和top
(以及类似/改进的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
使用
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
评论
stackoverflow.com/questions/268680/…