每日一道shell练习(03)

1 . 习题

写一个脚本计算linux系统所有进程占用内存大小的和

2. 习题分析

2.1.第一个问题,在哪里收集进程的数据

用top或者ps都可以获取每个进程的内存使用大小。获得大小之后,就可以通过一个循环计算它们的和了。

2.2. ps 命令的问题

通过累加 “ps aux” 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的。因为,RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。

2.3. 应该如何获取正确的使用内存

正确的方法是累加 /proc/[0-9]*/smaps 中的 Pss 。/proc/<pid>/smaps 包含了进程的每一个内存映射的统计值,详见proc(5)的手册页。Pss(Proportional Set Size)把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。

3. 习题答案

grep  Pss  /proc/[0-9]*/smaps | awk ‘{sum+=$2};END{print sum}‘
69275

【分析】

  1. grep 命令可以遍历目录里的文件,然后将符合匹配字符的行抓取出来;
  2. awk 命令遍历grep 输出的结果,统计进程使用内存的和。
  3. 在 /proc 目录下,有很多和进程有关的数据,读者可以自己去研究一下。

需要注意的是,全部进程占用的内存并不等于 free 命令所显示的 “used memory”,因为“used memory”不仅包含了进程所占用的内存,还包含cache/buffer以及kernel动态分配的内存等等。

原文地址:http://blog.51cto.com/hellocjq/2096807

时间: 2024-10-11 10:22:33

每日一道shell练习(03)的相关文章

每日一道shell练习(06)——检测端口服务

1. 题目 写一个脚本,判断本机的80端口(假设服务为httpd)是否开启着,如果开启着就什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己.脚本写好后,每分钟执行一次,也可以写一个死循环的脚本,30S检查一次. 2. 习题分析 首先,我们要区分要求,这里的要求是检测80端口是否在监听,而不是检测httpd服务是否运行,虽然两者有一定的联系,但并不是对等的关系.检测端口状态用 netstat -lntp 命令.如果要求检测远程主机的端口状态,则用一下的命令: nmap

每日一道shell脚本练习(01)

0. 引言 准备开一个新坑,每天更新一道shell练习.因为shell脚本属于那种不练习就会生疏,甚至忘记的技能,所以,为了对抗遗忘阻力,我只能不断加强练习了. 1. 第一天练习题目 [题目]请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2018-04-08.log,并且把磁盘的使用情况写到这个文件中,不用考虑cron,仅仅写脚本即可. [分析]第一点,要明白 linux 命令 date 的用法,打印"xxxx-xx-xx"这样的时间格式用date

每日一道shell练习(04)

1. 习题 设计一个脚本,监控远程的一台主机(假设 ip地址是110.110.110.114)的存活状态,当发现宕机时发一封邮件给你自己. 提示: 你可以使用 ping 命令 : ping -c 10 110.110.110.114 脚本可以搞成死循环. 2. 习题分析 其实这中需求并不困难,题目也给出了思路.关键是确定一个阈值,当检测到结果符合阈值,就触发警告,发送警告邮件. 我们可以先在主机上尝试执行一下 ping -c 命令: [[email protected] work]# ping

每日一道shell练习(10)——统计字符数

1. 习题 将下面这句话中字符数在6以内的单词打印出来: Bash also interprets a number of multi-character options . 2. 习题分析 思路:用for循环将每个单词取出,才能单独统计.for循环的分隔符有空格.tab键和回车键,刚好这句话的分隔符是空格键. 3. 脚本 #!/bin/bash line='Bash also interprets a number of multi-character options .' sum=0 for

每日一道shell 练习(05)——批量打包文件

1. 习题 找到 /123 目录下所有后缀名为 .txt 的文件 批量修改.txt 为 .txt.bak 把所有.bak 文件打包压缩为 123.tar.gz 批量还原文件的名字,即把增加的.bak 再删除 2. 习题分析 首先要想办法找出 .txt 结尾的文件,用 find 命令. 打包命令用 tar czvf 就可以搞定了,关键是如何同时将所有 .bak 文件打包. 还原文件名有点复杂,关键是如何找到原来的文件名. 3. 具体脚本 在脚本总已经加进了我的分析,可以看看 [[email pro

每日一道shell练习(09)——sed处理

1. 习题 对一个文件,1至5行删除带有英文的行,6至10行删除里面的英文字符: 2. 分析 这种要求,用sed命令就可以解决了,主要用到匹配替换的知识. 3. 脚本 #!/bin/bash sed -n '1,5p' a.txt | sed '/[a-zA-Z]/d' sed -n '6,10p' a.txt | sed 's/[a-zA-Z]//g' sed -n '11,$p' a.txt 前两个要求,必须使用行号匹配.主要sed是一个流编辑处理器,它是一行一行地接收输入数据,然后再处理.

【转】shell 教程——03 Shell脚本语言与编译型语言的差异

大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言. 编译型语言 很多传统的程序设计语言,例如Fortran.Ada.Pascal.C.C++和Java,都是编译型语言.这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”. 运行程序时,直接读取目标代码(object code).由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点. 但是,由于编译型语言多半运

每日回顾Shell —cat,tail,head

Shell中常常会用到cat命令.可是总是不是特别清楚: cat命令的用途是连接文件或标准输入并打印. 这个命令经常使用来显示文件内容.或者将几个文件连接起来显示.或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件]... 2.命令功能: cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一个文件:cat > filename 仅仅能创建新文件,不能编辑已有文件. 3.将几个文件合并为一个文件:cat file1

每日一shell(十)yum安装包for循环检查安装

有时候安装yum包,发现有的已经安装过了但是如果执行安装,yum需要检查源,输出一堆的信息,看起来很烦,于是就想到了先检查后安装,如果本地已经安装,不执行安装,如果没有安装就进行安装. 去重后需要安装的yum安装包如下: autoconf bison bison-devel bzip2 bzip2-devel ca-certificates cairo-devel c-ares c-ares-devel cmake crontabs curl curl-devel diffutils e2fsp