干掉僵尸进程

作者: Mingo 分类: Linux命令,瞎扯淡 发布时间: 2019-04-12 19:29

—–> 命令行的学习捷径 <—–

Linux 命令有许多强大的功能:从简单的磁盘操作、文件存取,到进行复杂的多媒体图像和流媒体文件的制作,都离不开命令行。

在 Linux 的学习中,新手都会遇到这么一个问题:自己对系统的每个命令都很熟悉,但是在系统出现故障的时候,就无从下手了。

说到底,就是学习的理论知识没有很好地与系统实际操作相结合。

—–> 5 大系统运维状态 <—–

对运维来说,查看系统运行状态是最基础的工作之一。

要了解 CPU、内存、进程、磁盘、网络,这五大运维系统的运行状态,需要掌握的运维命令有 ls、ps、free、top、uptime、ifconfig、su/sudo、dmesg、iostat、vmstat、sar、htop、iotop、smem 等命令。

这些命令有的非常简单,不做过多介绍,重点介绍几个高效、神奇的命令,它能帮助我们快速了解系统运行状态,绝对是运维神器。

—–> 典型 Linux 命令行 <—–

Linux 使用到了虚拟内存,因此要准确的计算一个进程实际使用的物理内存就不是那么简单。

Smem 是一款命令行下的内存使用情况报告工具,它能够给用户提供 Linux 系统下的内存使用的多种报告。

—–> 内存状态检测工具 <—–

yum 安装 smem 工具:

yum install smem python-matplotlib python-tk
显示系统中每个进程的占用内存状态
[root@development ~]# smem -k -s uss

-k :显示内存单位;
-s :排序,uss 是对 uss 列进行排序;
以百分比的形式报告内存使用情况
[root@development ~]# smem -p -s uss

-p :以百分比的形式报告内存使用情况;
显示系统中每一个用户的内存使用情况
[root@development ~]# smem -u -s uss

-u :表示显示用户占用内存信息;
查看某个进程占用内存大小
[root@development ~]# smem -k -P nginx

-u :查看某个进程占用内存大小;

—–> CPU/内存占用进程 <—–

这个应用需求在服务器的问题排查和故障处理上使用率非常高,要获取这些信息,只需要一些命令组合即可实现,可以说非常简单。

首先,获取当前系统占用 CPU 最高的前 10 个进程最简单的方式是通过 ps 命令组合实现,例如:

[root@development ~]# ps aux | head -1
[root@development ~]# ps aux | sort -rn -k3 | head -10
查看占用 CPU 百分比前十的进程

第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)信息。而“head:-N”可以指定显示的行数,默认显示 10 行。

第二个命令是一个输出加排序组合,ps 参数的 a 指代 all,表示所有的进程,u 指代 user id,就是执行该进程的用户 id,x 指代显示所有程序,不以终端机来区分。

接下来是 sort 命令,其中:r 指代 reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。n 指代 numberic sort,根据其数值排序。k 代表根据哪一列进行排序,后面的数字 3 表示按照第 3 列排序。本例中,可以看到 %CPU 在第 3 个位置,因此 k3 表示根据 %CPU 的数值进行由大到小的排序。

接下来的“|”为管道符号,将查询出的结果导到下面的命令中进行下一步的操作。
最后的“head -10”命令获取默认前 10 行数据。

—–> 清除僵尸过程 <—–

一个僵尸进程产生的过程是:父进程调用 fork 创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中。

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

[root@development ~]# ps -e -o stat,ppid,pid,cmd | egrep  '^[Zz]'Z
10808 10812 [java] <defunct>

-e:参数用于列出所有的进程;

-o:参数用于设定输出格式,这里只输出进程的 stat(状态信息)、ppid(父进程 pid)、pid(当前进程的 pid),cmd(即进程的可执行文件);

egrep:是 Linux 下的正则表达式工具;

'^[Zz]':这是正则表达式,^表示第一个字符的位置,[Zz] 表示小写 z 或者大写的 Z 字母,即表示第一个字符为 Z 或者 z 开头的进程数据,之所以这样是因为僵尸进程的状态信息以 Z 或者 z 字母开头;

找到僵尸进程的 pid 后,直接通过“kill -9 pid”命令杀掉即可,但是如果僵尸进程很多的话,就会很繁琐,因此,还需要一个批量删除僵尸进程的办法:

[root@development ~]# ps -e -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

这是个命令组合,通过管道实现命令的组合应用。

“grep -e”相当于 egrep 命令。

“awk ‘{print $2}’ ”是将前面命令的输出信息进行过滤,仅仅输出第二列的值,而第二列就是进程的 ppid。

“xargs kill -9”这是将得到的 ppid 传给“kill -9”作为参数,也就是 kill 掉这些 ppid。xargs 命令可以将标准输入转成各种格式化的参数,这里是将管道的输出内容作为参数传递给 kill 命令。

世界如此美好,不如赏我几块钱~

发表评论

电子邮件地址不会被公开。 必填项已用*标注