1、系统监控概述

采集的监控信息主要有内存占用率,CPU占用率,当前在线用户,磁盘挂载及磁盘空间使用率,平均每秒写入流量,平均每秒流出流量。磁盘IO:平均每秒从磁盘读入内存的速率,平均每秒从内存写入磁盘的速率。

2、监控原理

2.1、CPU占用率

监控原理:

CPU相关信息记录在文件 /proc/stat中。详情请查看博文:https://blog.csdn.net/ustclu/article/details/1721673

  1. stephen@stephen-K55VD:~/shell$ cat /proc/stat
  2. cpu
  3. cpu0
  4. cpu1
  5. cpu2
  6. cpu3
  7. intr
  8. ctxt
  9. btime
  10. processes
  11. procs_running
  12. procs_blocked
  13. softirq

代码实现:

  1. #获取CPU的总量与使用量
  2. cpuTotalStart=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
  3. cpuUsedStart=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
  4. #隔30s再获取一次CPU总量与使用量并计算差值
  5. sleep
  6. cpuTotalEnd=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
  7. cpuUsedEnd=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
  8. usedCPU=`expr ${cpuUsedEnd} - ${cpuUsedStart}`
  9. totalCPU=`expr ${cpuTotalEnd} - ${cpuTotalStart}`

2.2、内存占用率

监控原理:

内存相关的信息记录在/proc/meminfo文件中,MemTotal为内存总量,单位为kb,MemFree为空闲内存。内存占用率=(总内存-空闲内存)/ 总内存。

  1. stephen@stephen-K55VD:~/shell$ cat /proc/meminfo
  2. MemTotal: kB
  3. MemFree: kB
  4. MemAvailable: kB
  5. Buffers: kB
  6. Cached: kB
  7. SwapCached: kB
  8. Active: kB

代码实现:

  1. #获取内存使用率
  2. function memUsage(){
  3. logInfo "Begin to get mem usage of Host [${ip}]"
  4. #获取总内存
  5. totalMem=`awk '/MemTotal/{print $2}' /proc/meminfo`
  6. #获取空闲内存
  7. freeMem=`awk '/MemFree/{print $2}' /proc/meminfo`
  8. usedMem=`expr ${totalMem} - ${freeMem}`
  9. #echo $(usagePercent ${usedMem} ${totalMem})
  10. #echo $(kbToGb ${totalMem})
  11. logInfo "Host [${ip}] total mem is : $(kbToGb ${totalMem}) GB"
  12. #计算内存使用率并打印到日志中
  13. logInfo "Host [${ip}] mem usage is : $(usagePercent ${usedMem} ${totalMem}) %"
  14. logInfo "End to get mem usage of Host [${ip}]"
  15. }

2.3、流量监控

监控原理:

Linux机器流量信息记录在/proc/net/dev文件中。通过计算一段时间段内接收和发送的字节数来计算速率。第一列为网卡信息,第二列为接收的字节数,第10列为发送的字节数。

  1. stephen@stephen-K55VD:~/shell/sysMonitor$ cat /proc/net/dev
  2. Inter-| Receive | Transmit
  3. face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
  4. wlp3s0:
  5. enp4s0f2:
  6. docker0:
  7. lo:

代码实现:

  1. #ethName为网卡名称
  2. receiveByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
  3. sendByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`

2.4、磁盘IO

监控原理:

磁盘IO相关的信息记录在/proc/vmstat文件中,pgpgin对应的为输入方向的数据量。pgpgout对应的为输出方向的数据量。采集一段时间的数据量,除以时间来计算速率。

代码实现:

  1. #disk IO in
  2. function diskIOIn(){
  3. #获取磁盘入方向IO
  4. inIoStart=`awk '/pgpgin/{print $2}' /proc/vmstat`
  5. sleep
  6. inIoEnd=`awk '/pgpgin/{print $2}' /proc/vmstat`
  7. inIo=$(((inIoEnd-inIoStart)/(*)))
  8. logInfo "Host [${ip}] in IO is : ${inIo} MB / s"
  9.  
  10. }

3、脚本代码

  • hostLists:监控主机的IP集合。
  • sysMonitor.sh*:获取各项监控信息的脚本。
  1. #!/bin/bash
  2. #监控linux主机系统信息
  3. #导入工具模块
  4. source utils
  5.  
  6. #获取CPU占用率
  7. function cpuUsage()
  8. {
  9. #物理CPU个数
  10. phyCPUNums=`cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l`
  11. #逻辑CPU个数
  12. lgCPUNums=`cat /proc/cpuinfo |grep "processor"|wc -l`
  13. #core
  14. cores=`cat /proc/cpuinfo |grep "cores"|uniq|awk '{print $4}'`
  15. logInfo "Host [${ip}] physical CPU nums is : ${phyCPUNums}"
  16. logInfo "Host [${ip}] logic CPU nums is : ${lgCPUNums}"
  17. logInfo "Host [${ip}] core nums is : ${cores}"
  18. #CPU占用率
  19. #获取CPU的总量与使用量
  20. cpuTotalStart=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
  21. cpuUsedStart=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
  22. #隔30s再获取一次CPU总量与使用量并计算差值
  23. sleep
  24. cpuTotalEnd=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
  25. cpuUsedEnd=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
  26. usedCPU=`expr ${cpuUsedEnd} - ${cpuUsedStart}`
  27. totalCPU=`expr ${cpuTotalEnd} - ${cpuTotalStart}`
  28. logInfo "Host [${ip}] CPU usage is : $(usagePercent ${usedCPU} ${totalCPU}) %"
  29.  
  30. }
  31.  
  32. #获取内存使用率
  33. function memUsage(){
  34. logInfo "Begin to get mem usage of Host [${ip}]"
  35. #获取总内存
  36. totalMem=`awk '/MemTotal/{print $2}' /proc/meminfo`
  37. #获取空闲内存
  38. freeMem=`awk '/MemFree/{print $2}' /proc/meminfo`
  39. usedMem=`expr ${totalMem} - ${freeMem}`
  40. #echo $(usagePercent ${usedMem} ${totalMem})
  41. #echo $(kbToGb ${totalMem})
  42. logInfo "Host [${ip}] total mem is : $(kbToGb ${totalMem}) GB"
  43. #计算内存使用率并打印到日志中
  44. logInfo "Host [${ip}] mem usage is : $(usagePercent ${usedMem} ${totalMem}) %"
  45. logInfo "End to get mem usage of Host [${ip}]"
  46. }
  47.  
  48. #网卡平均每秒流量
  49. function netData(){
  50. logInfo "Begin to get net data of Host [${ip}]"
  51. ethName=$
  52. receiveByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
  53. sendByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
  54. sleep
  55. receiveByteSEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
  56. sendBytesEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
  57. inDataRate=$(echo "scale=2;(${receiveByteSEnd}-${receiveByteStart})/10" | bc)
  58. outDataRate=$(echo "scale=2;(${sendBytesEnd}-${sendByteStart})/10" | bc)
  59. logInfo "Host [${ip}] in data is : ${inDataRate} kb / s"
  60. logInfo "Host [${ip}] out data is : ${outDataRate} kb / s"
  61. logInfo "End to get net data of Host [${ip}]"
  62. }
  63.  
  64. #磁盘空间使用情况
  65. function diskUsage(){
  66. logInfo "Begin to get disk usage of Host [${ip}]"
  67. noTimeLogInfo "`df -h`"
  68. logInfo "End to get disk usage of Host [${ip}]"
  69. }
  70.  
  71. #disk IO in
  72. function diskIOIn(){
  73. #获取磁盘入方向IO
  74. inIoStart=`awk '/pgpgin/{print $2}' /proc/vmstat`
  75. sleep
  76. inIoEnd=`awk '/pgpgin/{print $2}' /proc/vmstat`
  77. inIo=$(((inIoEnd-inIoStart)/(*)))
  78. logInfo "Host [${ip}] in IO is : ${inIo} MB / s"
  79.  
  80. }
  81.  
  82. #disk IO out
  83. function diskIOout(){
  84. #获取磁盘出方向的IO
  85. outIoStart=`awk '/pgpgout/{print $2}' /proc/vmstat`
  86. sleep
  87. outIoEnd=`awk '/pgpgout/{print $2}' /proc/vmstat`
  88. outIo=$(((outIoEnd-outIoStart)/(*)))
  89. logInfo "Host [${ip}] out IO is : ${outIo} MB / s"
  90. }
  91.  
  92. #当前在线用户
  93. function onlineUser(){
  94. user=`w |awk 'NR>1'|awk '{print $1 "\t" "\t" $4}'`
  95. userCount=`w |awk 'NR>1'|wc -l`
  96. #loginAt=`w |awk 'NR>1'|awk '{print $4 }'`
  97. logInfo "There are [${userCount}] users online now."
  98. noTimeLogInfo "UserName loginAt"
  99. noTimeLogInfo "${user}"
  100. }
  101.  
  102. #判断主机网络连通性
  103. function isAlive(){
  104. for ip in `cat hostLists`
  105. do
  106. ping ${ip} -c >/dev/null
  107. if [ $? -eq ];then
  108. logInfo "${ip} is reachable"
  109. #查看在线用户
  110. onlineUser
  111. #获取CPU相关信息
  112. cpuUsage
  113. #获取mem相关信息
  114. memUsage
  115. #获取磁盘IO
  116. diskIOIn
  117. diskIOout
  118. #磁盘使用率
  119. diskUsage
  120. #平均每秒流接收或输出流量
  121. netData wlp3s0
  122. else
  123. logInfo "ERROR ${ip} is unreachable,try login in see more details.."
  124. fi
  125. done
  126. }
  127.  
  128. while [ ]
  129. do
  130. isAlive
  131. sleep
  132. done
  • utils:打印日志的函数等。
  1. #!/bin/bash
  2. #日志打印
  3. curr_path=`pwd`
  4. function logInfo()
  5. {
  6. local curr_time=`date "+%Y-%m-%d %H:%M:%S"`
  7. log_file=${curr_path}/system_status.log
  8. #判断日志文件是否存在
  9. if [ -e ${log_file} ]
  10. then
  11. #检测文件是否可写
  12. if [ -w ${log_file} ]
  13. then
  14. #若文件无写权限则使用chmod命令赋予权限
  15. chmod ${log_file}
  16. fi
  17. else
  18. #若日志文件不存在则创建
  19. touch ${log_file}
  20. fi
  21. #写日志
  22. local info=$
  23. echo "${curr_time} `whoami` [Info] ${info}">>${log_file}
  24. }
  25. function noTimeLogInfo(){
  26. msg=$
  27. echo "${msg}">>${log_file}
  28. }
  29.  
  30. #把kb转换成gb,精度为3。expr只支持整数计算
  31. function kbToGb(){
  32. kbVal=$
  33. gbVal=$(echo "scale=3;${kbVal}/1024/1024"| bc)
  34. echo $gbVal
  35. }
  36. #使用率以百分比的形式
  37. #第一个参数为已使用量,第二个参数为总量
  38. function usagePercent(){
  39. used=$
  40. total=$
  41. usedPercent=$(echo "scale=2;${used}*100/${total}"| bc)
  42. echo ${usedPercent}
  43. }

脚本结构:

  1. -rw-r--r-- stephen stephen 4 : hostLists
  2. -rwxrwxr-x stephen stephen 4 : sysMonitor.sh*
  3. -rw-r--r-- stephen stephen 4 : utils

4、运行结果

监控信息记录在日志system_status.log中。运行结果如下:

  1. -- :: stephen [Info] 192.168.1.109 is reachable
  2. -- :: stephen [Info] There are [] users online now.
  3. UserName loginAt
  4. USER LOGIN@
  5. stephen :
  6. -- :: stephen [Info] Host [192.168.1.109] physical CPU nums is :
  7. -- :: stephen [Info] Host [192.168.1.109] logic CPU nums is :
  8. -- :: stephen [Info] Host [192.168.1.109] core nums is :
  9. -- :: stephen [Info] Host [192.168.1.109] CPU usage is : 10.12 %
  10. -- :: stephen [Info] Begin to get mem usage of Host [192.168.1.109]
  11. -- :: stephen [Info] Host [192.168.1.109] total mem is : 3.741 GB
  12. -- :: stephen [Info] Host [192.168.1.109] mem usage is : 95.83 %
  13. -- :: stephen [Info] End to get mem usage of Host [192.168.1.109]
  14. -- :: stephen [Info] Host [192.168.1.109] in IO is : MB / s
  15. -- :: stephen [Info] Host [192.168.1.109] out IO is : MB / s
  16. -- :: stephen [Info] Begin to get disk usage of Host [192.168.1.109]
  17. 文件系统 容量 已用 可用 已用% 挂载点
  18. udev .9G .9G % /dev
  19. tmpfs 384M 2.0M 382M % /run
  20. /dev/sda10 42G 20G 20G % /
  21. tmpfs .9G 20M .9G % /dev/shm
  22. tmpfs 5.0M .0K 5.0M % /run/lock
  23. tmpfs .9G .9G % /sys/fs/cgroup
  24. /dev/loop0 3.8M 3.8M % /snap/notepad-plus-plus/
  25. /dev/loop2 54M 54M % /snap/core18/
  26. /dev/loop4 441M 441M % /snap/wine-platform/
  27. /dev/loop5 441M 441M % /snap/wine-platform/
  28. /dev/loop7 3.8M 3.8M % /snap/notepad-plus-plus/
  29. /dev/loop3 90M 90M % /snap/core/
  30. /dev/loop1 274M 274M % /snap/wps-office-multilang/
  31. /dev/loop6 91M 91M % /snap/core/
  32. /dev/loop8 92M 92M % /snap/core/
  33. /dev/loop9 36M 36M % /snap/gtk-common-themes/
  34. /dev/loop10 3.8M 3.8M % /snap/notepad-plus-plus/
  35. /dev/loop11 441M 441M % /snap/wine-platform/
  36. tmpfs 384M 16K 384M % /run/user/
  37. tmpfs 384M 52K 384M % /run/user/
  38. -- :: stephen [Info] End to get disk usage of Host [192.168.1.109]
  39. -- :: stephen [Info] Begin to get net data of Host [192.168.1.109]
  40. -- :: stephen [Info] Host [192.168.1.109] in data is : 42.90 kb / s
  41. -- :: stephen [Info] Host [192.168.1.109] out data is : 7.00 kb / s
  42. -- :: stephen [Info] End to get net data of Host [192.168.1.109]
  43. -- :: stephen [Info] ERROR 255.255.255.254 is unreachable,try login in see more details..

5、参考文档

5.1、ifstat网络流量监控之/proc/net/dev文件

https://blog.csdn.net/kongshuai19900505/article/details/80676607

5.2、awk命令

http://man.linuxde.net/awk

5.3、使用shell脚本采集系统cpu、内存、磁盘、网络等信息

https://www.jb51.net/article/50436.htm

shell实战之Linux主机系统监控的更多相关文章

  1. Linux 服务器系统监控脚本 Shell【转】

    转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...

  2. Day 7 Linux之系统监控、硬盘分区等

    Linux之系统监控.硬盘分区等 系统监控 系统监视和进程控制工具—top和free 1) 掌握top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况, ...

  3. zabbix入门到精通之Zabbix对linux主机的监控

    我们大概了解了怎么对台主机进行监控,主要步骤设计到添加主机,并且为主机添加监控项,这里主要为item,然后在item的基础上对item进行绘图并且通过screen的方式把不同的监控图像汇总到一张scr ...

  4. linux常用系统监控命令

    原文:http://blog.sina.com.cn/s/blog_68f1c17001016uvy.html Linux提供了很多用于监控系统的工具,使用这些工具可以找到导致系统性能降低的瓶颈.系统 ...

  5. Linux基础——系统监控

    系统监视和进程控制工具——top(任务管理器) top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 各行数据大致解释如下: 12: ...

  6. shell:实现linux服务器资源监控并发送告警邮件

    1.安装方式 wget http://10.8.225.126/wsmonitor/install.sh;sh install.sh test@test.com 2.install.sh #!/bin ...

  7. 用shell脚本挂载linux主机拷贝相应文件copy.sh

    #!/bin/sh # $1 MOUNTDIR $2 TARGETDIR $3 ERRORLOG #参数检查 if test $# -ne 3 then echo "argument che ...

  8. 用shell脚本挂载linux主机拷贝相应文件

    #!/bin/sh TARGETIP=192.168.88.3 #这里是你要挂在的ftp服务器的IP地址 MOUNTDIR=/mnt TARGETDIR=/root/Desktop/Work ERRO ...

  9. Shell 脚本实现 Linux 系统监控

    一.实验介绍 1.1 实验内容 本课程实现 shell 脚本监控系统的各项参数,并可以将脚本加入系统环境中,可以直接在终端里执行.还添加了几个参数,一个脚本可以执行不同的操作. 1.2 知识点 本实验 ...

随机推荐

  1. sqlzoo:4

    列出每個國家的名字 name,當中人口 population 是高於俄羅斯'Russia'的人口. SELECT name FROM world WHERE population > (SELE ...

  2. 洛谷P3802:小魔女帕琪

    题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从而唱出强力的魔法.比如说 ...

  3. pywin32模块安装

    安装流程: 1.查看python版本和位数: 2.下载对应的的pywin32,下载目录任意 https://sourceforge.net/projects/pywin32/files%2Fpywin ...

  4. Linux服务器运维基本命令

     ========Linux 服务器常用命令================ cd / 根目录cd ../ 上级目录   ls 列出文件目录    clear 清空控制台tar cvzf name.C ...

  5. 使用Ant Build时提示错误: 编码GBK的不可映射字符

    这个build.xml是由eclipse neon 2016.6生成的 我的情况是,所有文件都使用了UTF-8编码,build.xml第一行也好好写着UTF-8,但build时仍然有乱码,并且提示失败 ...

  6. python爬虫第五天

            cookie           我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态 ...

  7. 11、js 数组详细操作方法及解析合集

    js 数组详细操作方法及解析合集 前言 在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总结,很多时候就算用过几次这个api,在开发中也很容易 ...

  8. C++实验一

    实验结论 2-28 if...else #include <iostream> #include <stdlib.h> using namespace std; int mai ...

  9. Servlet 过滤器Filter

    特点 1)Filter是依赖于Servlet容器,属于Servlet规范的一部分,在Servlet API中定义了三个接口类:Filter, FilterChain, FilterConfig. 2) ...

  10. HBuilder git使用-分工合作

    1.初始项目的创建 创建好项目,在项目名上右键,Team->共享 完成后,就实现了本地仓库的建立,另外你要注意现在创建的项目所有文件变成了红色,Git Repositories视图列出了相应的本 ...