如何(从终端)获取线程总数(每个进程以及所有进程的总数)


Answers:


53

要获取给定pid的线程数:

ps -o nlwp <pid>

要获得系统中运行的所有线程的总和:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

1
ps -o nlwp <pid>返回NLWP :),这是什么意思?
悉达多

2
@Siddharth NLWP代表轻量进程数,它是线程数。
jcollado

您可以使用“ h”(隐藏标题)取消显示“ NLWP”;即:ps h -o nlwp $pid
bufh 2016年

7

要查找运行单个进程的线程数,可以查看/proc/<pid>/status。它应将线程数列为字段之一。


3

我根据这个答案ps axmsps是列出正在运行的内容的好工具。

如果要按进程过滤,可以尝试如下操作:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

我们减去1,因为grep将显示在该列表中。

一般而言,对于所有线程,这应该起作用:

echo $(( `ps axms | wc -l`  - 1))

这次我们减去一个,因为有一个标题行。


这是不准确的,因为它报告每个进程有一个额外的线程
Score_Under

1

要获取一个线程的总数(一个进程同时运行的微小部分),可以使用命令“一直ps -o nlwp <pid>有效”。但是,如果您希望尝试通过文件查看它。您可能应该查看为系统的每个过程创建的文件。在那里,您可以获得过程的最终细节。对于每个过程,都会在/proc/<pid>其中创建一个文件夹,您还可以看到所有其他详细信息。


1

特别是在linux上,这是一种按进程执行此操作的方法:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

然后,您可以使用PID作为参数来调用此脚本,它将报告该进程拥有的线程数。

要获得整个系统的线程数,这足以:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

这些方法似乎在它们严重依赖于外壳的功能有点非正统的,但在两者的回报是快于相应的psawk我的机器为基础的方法(同时不会对管道创建自己的额外的线程)。请记住,为运行这些脚本而启动的外壳将具有其自己的线程(或者,如果您使用的是奇怪的实现,则会有更多线程)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.