查询当前整个系统每个进程的线程数

工作中经常遇到这样的问题:某台服务器的CPU使用率飙升,通过top命令查看是某个程序(如Java)占用的
image.png
forpidin$(psef|grepvgrep|grepjava|awk’{print$2}’):获取${pid}变量为Java进程的PID号。➢echo${pid}>/tmp/a.txt:将Java进程的PID号都打印到/tmp/a.txt文件中。➢cat/proc/${pid}/status|grepThreads>/tmp/b.txt:将各个PID进程号下的线程信息打印到/tmp/b.txt文件中。➢paste/tmp/a.txt/tmp/b.txt:以列的形式展示a.txt和b.txt文件中的信息。➢sortk3rn:对输出的信息进行排序。其中,k3表示以第3列进行排序,rn表示降序排列。

如何检测系统中的僵尸进程并将其kill

要查找系统中的僵尸进程有多种方法,这里给出一种命令行探测僵尸进程的方法:

image.png
➢e:用于列出所有的进程。➢o:用于设定输出格式,这里只输出进程的stat(状态信息)、ppid(父进程PID)、pid(当前进程的PID),cmd(进程的可执行文件)。➢egrep:Linux下的正则表达式工具。➢’^[Zz]’:正则表达式,^表示第一个字符的位置,[Zz]表示大写的Z或小写z字母,即表示第一个字符为Z或者z开头的进程数据,之所以这样是因为僵尸进程的状态信息以Z或者z字母开头。

批量删除僵尸进程的办法:

image.png
这是个命令组合,通过管道实现命令的组合应用。grepe相当于egrep命令;awk’{print$2}’将前面命令的输出信息进行过滤,仅仅输出第2列的值,而第2列就是进程的ppid;xargskill9将得到的ppid传给kill9作为参数,也就是kill掉这些ppid;xargs命令可以将标准输入转成各种格式化的参数,这里是将管道的输出内容作为参数传递给kill命令。其实这个命令组合是将僵尸进程的父进程kill掉,进而关闭僵尸进程。为什么要这么做呢?其实一般僵尸进程很难直接kill掉,因为僵尸进程已经是死掉的进程,它不能再接收任何信号。所以,需要kill僵尸进程的父进程,这样父进程被kill掉后,僵尸进程就成了孤儿进程,而所有的孤儿进程都会交给系统的1号进程(init或systemd)收养,1号进程会周期性地去调用wait来清除这些僵尸进程。因此可以发现,父进程kill掉之后,僵尸进程也随着消失了,这其实是1号进程作用的结果。

如何查看当前占用CPU或内存最多的几个进程

image.png
image.png