Linux下查看线程数的几种方法汇总

时间:2022-01-28 12:17:14

                  Linux下查看线程数的几种方法汇总

                                           作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.Linux下查看某个进程的线程数量

  pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。

1>.安装pstree命令行工具,包名为:“psmisc”

[root@yinzhengjie bin]# yum -y install psmisc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package psmisc.x86_64 :22.20-.el7 will be installed
--> Finished Dependency Resolution Dependencies Resolved ====================================================================================================================================================================
Package Arch Version Repository Size
====================================================================================================================================================================
Installing:
psmisc x86_64 22.20-.el7 base k Transaction Summary
====================================================================================================================================================================
Install Package Total download size: k
Installed size: k
Downloading packages:
psmisc-22.20-.el7.x86_64.rpm | kB ::
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : psmisc-22.20-.el7.x86_64 /
Verifying : psmisc-22.20-.el7.x86_64 / Installed:
psmisc.x86_64 :22.20-.el7 Complete!
[root@yinzhengjie bin]#

[root@yinzhengjie bin]# yum -y install psmisc

2>.相关参数介绍

Usage: pstree [ -a ] [ -c ] [ -h | -H PID ] [ -l ] [ -n ] [ -p ] [ -g ] [ -u ]
[ -A | -G | -U ] [ PID | USER ]
pstree -V
Display a tree of processes. -a, --arguments       显示命令时候,并显示其参数的完整内容 -A, --ascii   各进程树之间的连接以ASCII码字符来连接 -c, --compact     取消同名兄弟进程的合并(默认会将同名的兄弟进程合并) -h, --highlight-all      突出当前进程及其祖先
-H PID, --highlight-pid=PID       突出这个过程和它的祖先 -g, --show-pgids       显示进程组ID; -G, --vt100     使用VT100线绘制字符 -l, --long     不要截断长线。 -n, --numeric-sort       用PID排序输出
-N type,
--ns-sort=type       sort by namespace type (ipc, mnt, net, pid, user, uts) -p, --show-pids       同时列出每个进程的PID -s, --show-parents       显示选定过程的父母 -S, --ns-changes       显示命名空间转换

 -u, --uid-changes       同时列出每个进程的所属账号名称 -U, --unicode     各进程树之间的连接以utf8字符来连接,某些终端可能会有错误 -V, --version     显示版本信息
-Z,
--security-context       显示SELinux的安全上下文 PID        从这个PID开始;默认值是1(init)。 USER         只显示在该用户的进程中的树

3>.案例1-显示进程之间的关系

[root@yinzhengjie bin]# pstree -apnh
systemd, --switched-root --system --deserialize
├─systemd-journal,
├─systemd-udevd,
├─lvmetad, -f
├─auditd,
│ └─{auditd},
├─irqbalance, --foreground
├─systemd-logind,
├─polkitd, --no-debug
│ ├─{polkitd},
│ ├─{polkitd},
│ ├─{polkitd},
│ ├─{polkitd},
│ └─{polkitd},
├─dbus-daemon, --system --address=systemd: --nofork --nopidfile --systemd-activation
├─NetworkManager, --no-daemon
│ ├─{NetworkManager},
│ └─{NetworkManager},
├─crond, -n
├─chronyd,
├─agetty, --noclear tty1 linux
├─sshd, -D
│ ├─sshd,
│ │ └─bash,
│ │ └─pstree, -apnh
│ └─sshd,
│ └─bash,
├─tuned, -Es /usr/sbin/tuned -l -P
│ ├─{tuned},
│ ├─{tuned},
│ ├─{tuned},
│ └─{tuned},
├─gmetad, -d
│ ├─{gmetad},
│ ├─{gmetad},
│ ├─{gmetad},
│ ├─{gmetad},
│ ├─{gmetad},
│ ├─{gmetad},
│ ├─{gmetad},
│ └─{gmetad},
├─httpd, -DFOREGROUND
│ ├─httpd, -DFOREGROUND
│ ├─httpd, -DFOREGROUND
│ ├─httpd, -DFOREGROUND
│ ├─httpd, -DFOREGROUND
│ └─httpd, -DFOREGROUND
├─rsyslogd, -n
│ ├─{rsyslogd},
│ └─{rsyslogd},
├─zabbix_agentd, -c /etc/zabbix/zabbix_agentd.conf
│ ├─zabbix_agentd,
│ ├─zabbix_agentd,
│ ├─zabbix_agentd,
│ ├─zabbix_agentd,
│ └─zabbix_agentd,
├─gmond,
│ └─{gmond},
└─java, -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/soft/zk/bin/../build/classes:/soft/zk/bin/../build/lib/*.jar:/soft/zk/bin/../lib/
├─{java},2487
├─{java},2488
├─{java},2489
├─{java},2490
├─{java},2491
├─{java},2492
├─{java},2493
├─{java},2494
├─{java},2495
├─{java},2496
├─{java},2497
├─{java},2498
├─{java},2499
├─{java},2500
├─{java},2501
├─{java},2502
├─{java},2503
├─{java},2504
├─{java},2505
├─{java},2506
├─{java},2507
├─{java},2508
├─{java},2509
├─{java},2510
├─{java},2511
├─{java},2512
├─{java},2513
├─{java},2514
├─{java},2515
├─{java},2516
├─{java},2517
├─{java},2518
├─{java},2519
├─{java},2520
├─{java},2521
├─{java},2522
├─{java},2523
├─{java},2524
├─{java},2525
├─{java},2526
├─{java},2527
├─{java},2528
├─{java},2529
├─{java},2530
├─{java},2531
├─{java},2532
├─{java},2534
├─{java},2535
├─{java},2536
├─{java},2537
├─{java},2538
├─{java},2539
├─{java},2540
├─{java},2541
├─{java},2542
├─{java},2543
├─{java},2544
├─{java},2545
├─{java},2546
├─{java},2547
├─{java},2548
└─{java},2549
[root@yinzhengjie bin]#

[root@yinzhengjie bin]# pstree -apnh

4>.案例2-以树状图显示进程,还显示进程PID

[root@yinzhengjie bin]# pstree -p
systemd()─┬─NetworkManager()─┬─{NetworkManager}()
│ └─{NetworkManager}()
├─agetty()
├─auditd()───{auditd}()
├─chronyd()
├─crond()
├─dbus-daemon()
├─gmetad()─┬─{gmetad}()
│ ├─{gmetad}()
│ ├─{gmetad}()
│ ├─{gmetad}()
│ ├─{gmetad}()
│ ├─{gmetad}()
│ ├─{gmetad}()
│ └─{gmetad}()
├─gmond()───{gmond}()
├─httpd()─┬─httpd()
│ ├─httpd()
│ ├─httpd()
│ ├─httpd()
│ └─httpd()
├─irqbalance()
├─java()─┬─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ ├─{java}()
│ └─{java}()
├─lvmetad()
├─polkitd()─┬─{polkitd}()
│ ├─{polkitd}()
│ ├─{polkitd}()
│ ├─{polkitd}()
│ └─{polkitd}()
├─rsyslogd()─┬─{rsyslogd}()
│ └─{rsyslogd}()
├─sshd()─┬─sshd()───bash()───pstree()
│ └─sshd()───bash()
├─systemd-journal()
├─systemd-logind()
├─systemd-udevd()
├─tuned()─┬─{tuned}()
│ ├─{tuned}()
│ ├─{tuned}()
│ └─{tuned}()
└─zabbix_agentd()─┬─zabbix_agentd()
├─zabbix_agentd()
├─zabbix_agentd()
├─zabbix_agentd()
└─zabbix_agentd()
[root@yinzhengjie bin]#

[root@yinzhengjie bin]# pstree -p

5>.案例3-显示命令和其完整参数

[root@yinzhengjie bin]# pstree -a
systemd --switched-root --system --deserialize
├─NetworkManager --no-daemon
│ └─*[{NetworkManager}]
├─agetty --noclear tty1 linux
├─auditd
│ └─{auditd}
├─chronyd
├─crond -n
├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
├─gmetad -d
│ └─*[{gmetad}]
├─gmond
│ └─{gmond}
├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ ├─httpd -DFOREGROUND
│ └─httpd -DFOREGROUND
├─irqbalance --foreground
├─java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/soft/zk/bin/../build/classes:/soft/zk/bin/../build/lib/*.jar:/soft/zk/bin/../lib/
│ └─62*[{java}]
├─lvmetad -f
├─polkitd --no-debug
│ └─5*[{polkitd}]
├─rsyslogd -n
│ └─2*[{rsyslogd}]
├─sshd -D
│ ├─sshd
│ │ └─bash
│ │ └─pstree -a
│ └─sshd
│ └─bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned -Es /usr/sbin/tuned -l -P
│ └─4*[{tuned}]
└─zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
├─zabbix_agentd
├─zabbix_agentd
├─zabbix_agentd
├─zabbix_agentd
└─zabbix_agentd
[root@yinzhengjie bin]#

[root@yinzhengjie bin]# pstree -a

6>.案例4-取消合并,默认会将同名的兄弟进程合并,-c取消合并,分开显示

[root@yinzhengjie bin]# pstree -c
systemd─┬─NetworkManager─┬─{NetworkManager}
│ └─{NetworkManager}
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─gmetad─┬─{gmetad}
│ ├─{gmetad}
│ ├─{gmetad}
│ ├─{gmetad}
│ ├─{gmetad}
│ ├─{gmetad}
│ ├─{gmetad}
│ └─{gmetad}
├─gmond───{gmond}
├─httpd─┬─httpd
│ ├─httpd
│ ├─httpd
│ ├─httpd
│ └─httpd
├─irqbalance
├─java─┬─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ ├─{java}
│ └─{java}
├─lvmetad
├─polkitd─┬─{polkitd}
│ ├─{polkitd}
│ ├─{polkitd}
│ ├─{polkitd}
│ └─{polkitd}
├─rsyslogd─┬─{rsyslogd}
│ └─{rsyslogd}
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned─┬─{tuned}
│ ├─{tuned}
│ ├─{tuned}
│ └─{tuned}
└─zabbix_agentd─┬─zabbix_agentd
├─zabbix_agentd
├─zabbix_agentd
├─zabbix_agentd
└─zabbix_agentd
[root@yinzhengjie bin]#

[root@yinzhengjie bin]# pstree -c  

7>.案例5-查询zookeeper进程打开的线程数

[root@yinzhengjie bin]# jps
QuorumPeerMain
Jps
[root@yinzhengjie bin]#
[root@yinzhengjie bin]#
[root@yinzhengjie bin]# pstree -p `jps | grep QuorumPeerMain | awk '{print $1}'` | wc -l [root@yinzhengjie bin]#
[root@yinzhengjie bin]#
[root@yinzhengjie bin]# pstree -p | wc -l [root@yinzhengjie bin]#

总结:

  通过pstree清晰的看到进程的父子关系,但是进程状态查看,还是需要ps、top等命令。pstree命令是用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出来是谁创建了谁。

  推荐学习的博客:http://www.runoob.com/linux/linux-command-manual.html

二.使用top命令查看

1>.使用pstree命令查看"ResourceManager"进程打开的线程数

[root@yinzhengjie ~]# jps
Jps
ResourceManager
JobTracker
NameNode
Bootstrap
DFSZKFailoverController
HistoryServer
HistoryServer
JobHistoryServer
[root@yinzhengjie ~]#
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# pstree -p | wc -l [root@yinzhengjie ~]#

2>.使用top命令查看“ResourceManager”打开的进程数

[root@yinzhengjie ~]# top -H -p
top - :: up days, :, users, load average: 0.02, 0.06, 0.05
Threads: total, running, sleeping, stopped, zombie
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
yarn S 0.3 3.4 :15.83 java
yarn S 0.0 3.4 :00.25 java
yarn S 0.0 3.4 :03.12 java
yarn S 0.0 3.4 :01.65 java
yarn S 0.0 3.4 :01.65 java
yarn S 0.0 3.4 :01.69 java
yarn S 0.0 3.4 :01.66 java
yarn S 0.0 3.4 :01.70 java
yarn S 0.0 3.4 :01.69 java
yarn S 0.0 3.4 :01.67 java
yarn S 0.0 3.4 :01.68 java
yarn S 0.0 3.4 :01.68 java
yarn S 0.0 3.4 :01.67 java
yarn S 0.0 3.4 :01.70 java
yarn S 0.0 3.4 :01.68 java
yarn S 0.0 3.4 :01.66 java
yarn S 0.0 3.4 :01.67 java
yarn S 0.0 3.4 :01.69 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :15.73 java
yarn S 0.0 3.4 :59.54 java
yarn S 0.0 3.4 :00.06 java
yarn S 0.0 3.4 :00.04 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :00.00 java
yarn S 0.0 3.4 :08.24 java
[root@yinzhengjie ~]#

[root@yinzhengjie ~]# top -H -p 10339

Linux下查看线程数的几种方法汇总

三.直接去“/proc”对应PID的status目录查看

由于在Linux操作系统中,正在运行的程序都会在/proc这个目录下存放运行时文件的状态信息,因此我们在这个目录下,找到对应的进程ID就可以查看到该进程打开的线程数。当然还有一些其他的详细信息都在这个目录下存放着。

[root@yinzhengjie ~]# cat /proc//status
Name: java
Umask:
State: S (sleeping)
Tgid:
Ngid:
Pid:
PPid:
TracerPid:
Uid:
Gid:
FDSize:
Groups:
VmPeak: kB
VmSize: kB
VmLck: kB
VmPin: kB
VmHWM: kB
VmRSS: kB
RssAnon: kB
RssFile: kB
RssShmem: kB
VmData: kB
VmStk: kB
VmExe: kB
VmLib: kB
VmPTE: kB
VmSwap: kB
Threads:
SigQ: /
SigPnd:
ShdPnd:
SigBlk:
SigIgn:
SigCgt: 2000000181005ccf
CapInh:
CapPrm:
CapEff:
CapBnd: 0000001fffffffff
CapAmb:
Seccomp:
Cpus_allowed: fffff
Cpus_allowed_list: -
Mems_allowed: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Mems_allowed_list: -
voluntary_ctxt_switches:
nonvoluntary_ctxt_switches:
[root@yinzhengjie ~]#

[root@yinzhengjie ~]# cat /proc/10339/status

Linux下查看线程数的几种方法汇总

四.直接去“/proc”对应PID的task目录查看

[root@yinzhengjie ~]# jps
Jps
ResourceManager
JobTracker
NameNode
Bootstrap
DFSZKFailoverController
HistoryServer
HistoryServer
JobHistoryServer
[root@yinzhengjie ~]#
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# pstree -p | wc -l [root@yinzhengjie ~]#
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# ll /proc//task/ | wc -l [root@yinzhengjie ~]#
[root@yinzhengjie ~]#