1.3 系统运维监控类命令
1.3.1 查询当前整个系统每个进程的线程数
工作中经常遇到这样的问题:某台服务器的CPU使用率飙升,通过top命令查看是某个程序(如Java)占用的CPU比较大,现在需要查询Java各个进程下的线程数情况。可以通这一个命令组合实现:
解释一下这个脚本。
➢ for pid in$(ps-ef|grep-v grep|grep java|awk '{print$2}'):获取${pid}变量为Java进程的PID号。
➢ echo${pid}>/tmp/a.txt:将Java进程的PID号都打印到/tmp/a.txt文件中。
➢ cat/proc/${pid}/status|grep Threads>/tmp/b.txt:将各个PID进程号下的线程信息打印到/tmp/b.txt文件中。
➢ paste/tmp/a.txt/tmp/b.txt:以列的形式展示a.txt和b.txt文件中的信息。
➢ sort-k3-rn:对输出的信息进行排序。其中,-k3表示以第3列进行排序,-rn表示降序排列。
将上面命令组合放入系统执行完毕后,输出内容如图1-1所示。
图1-1 排序输出结果
从输出可以看出,第1列显示的是Java的进程号,最后一列显示的每个Java进程对应的线程数量。这个例子是一个for循环加上ps命令和sort命令的综合应用实例。
1.3.2 如何检测系统中的僵尸进程并将其kill
要查找系统中的僵尸进程有多种方法,这里给出一种命令行探测僵尸进程的方法:
介绍一下用到的几个参数。
➢ -e:用于列出所有的进程。
➢ -o:用于设定输出格式,这里只输出进程的stat(状态信息)、ppid(父进程PID)、pid(当前进程的PID),cmd(进程的可执行文件)。
➢ egrep:Linux下的正则表达式工具。
➢ '^[Zz]':正则表达式,^表示第一个字符的位置,[Zz]表示大写的Z或小写z字母,即表示第一个字符为Z或者z开头的进程数据,之所以这样是因为僵尸进程的状态信息以Z或者z字母开头。
找到僵尸进程的PID后,直接通过kill -9 pid命令kill掉即可,但是如果僵尸进程很多,就会很烦琐,因此,还需要一个批量删除僵尸进程的办法:
这是个命令组合,通过管道实现命令的组合应用。grep -e相当于egrep命令;awk '{print$2}'将前面命令的输出信息进行过滤,仅仅输出第2列的值,而第2列就是进程的ppid;xargs kill -9将得到的ppid传给kill -9作为参数,也就是kill掉这些ppid;xargs命令可以将标准输入转成各种格式化的参数,这里是将管道的输出内容作为参数传递给kill命令。
其实这个命令组合是将僵尸进程的父进程kill掉,进而关闭僵尸进程。为什么要这么做呢?其实一般僵尸进程很难直接kill掉,因为僵尸进程已经是死掉的进程,它不能再接收任何信号。所以,需要kill僵尸进程的父进程,这样父进程被kill掉后,僵尸进程就成了孤儿进程,而所有的孤儿进程都会交给系统的1号进程(init或systemd)收养,1号进程会周期性地去调用wait来清除这些僵尸进程。因此可以发现,父进程kill掉之后,僵尸进程也随着消失了,这其实是1号进程作用的结果。
1.3.3 如何查看当前占用CPU或内存最多的几个进程
这个应用需求在服务器的问题排查和故障处理上使用率非常高,要获取这些信息,只需要一些命令组合即可实现。
(1)获取当前系统占用CPU最高的前10个进程
最简单的方式是通过ps命令组合实现,例如:
该命令组合主要分为两个部分。
➢ ps aux|head-1。
➢ ps aux|sort-rn-k3|head-10。
其中,第1句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)信息。而head:-N可以指定显示的行数,默认显示10行。
第2个命令是一个输出加排序组合,ps参数的a指代all,表示所有的进程;u指代user id,就是执行该进程的用户ID;x指代显示所有程序,不以终端机来区分。
接下来是sort命令。
➢ r指代reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。
➢ n指代numberic sort,根据其数值排序。
➢ k代表根据哪一列进行排序。
➢ 数字3表示按照第3列排序。
本例中,可以看到%CPU在第3个位置,因此k3表示根据%CPU的数值进行由大到小的排序。
接下来的|为管道符号,将查询出的结果导入下面的命令中进行下一步的操作。最后的head-10命令获取默认前10行数据。
(2)获取当前系统占用内存最高的前10个进程
同理,要获取系统占用内存最高的前10个进程,方法与获取CPU方法一致,命令组合修改如下:
这里仅仅修改了k3为k4,4代表第4列排序。本例中,可以看到%MEM在第4个位置,因此k4表示根据%MEM的数值进行由大到小的排序。