1、系统监控概述

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

2、监控原理

2.1、CPU占用率

监控原理:

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

stephen@stephen-K55VD:~/shell$ cat  /proc/stat
cpu
cpu0
cpu1
cpu2
cpu3
intr
ctxt
btime
processes
procs_running
procs_blocked
softirq

代码实现:

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

2.2、内存占用率

监控原理:

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

stephen@stephen-K55VD:~/shell$ cat /proc/meminfo
MemTotal: kB
MemFree: kB
MemAvailable: kB
Buffers: kB
Cached: kB
SwapCached: kB
Active: kB

代码实现:

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

2.3、流量监控

监控原理:

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

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

代码实现:

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

2.4、磁盘IO

监控原理:

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

代码实现:

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

3、脚本代码

  • hostLists:监控主机的IP集合。
  • sysMonitor.sh*:获取各项监控信息的脚本。
 #!/bin/bash
#监控linux主机系统信息
#导入工具模块
source utils #获取CPU占用率
function cpuUsage()
{
#物理CPU个数
phyCPUNums=`cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l`
#逻辑CPU个数
lgCPUNums=`cat /proc/cpuinfo |grep "processor"|wc -l`
#core
cores=`cat /proc/cpuinfo |grep "cores"|uniq|awk '{print $4}'`
logInfo "Host [${ip}] physical CPU nums is : ${phyCPUNums}"
logInfo "Host [${ip}] logic CPU nums is : ${lgCPUNums}"
logInfo "Host [${ip}] core nums is : ${cores}"
#CPU占用率
#获取CPU的总量与使用量
cpuTotalStart=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
cpuUsedStart=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
#隔30s再获取一次CPU总量与使用量并计算差值
sleep
cpuTotalEnd=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
cpuUsedEnd=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
usedCPU=`expr ${cpuUsedEnd} - ${cpuUsedStart}`
totalCPU=`expr ${cpuTotalEnd} - ${cpuTotalStart}`
logInfo "Host [${ip}] CPU usage is : $(usagePercent ${usedCPU} ${totalCPU}) %" } #获取内存使用率
function memUsage(){
logInfo "Begin to get mem usage of Host [${ip}]"
#获取总内存
totalMem=`awk '/MemTotal/{print $2}' /proc/meminfo`
#获取空闲内存
freeMem=`awk '/MemFree/{print $2}' /proc/meminfo`
usedMem=`expr ${totalMem} - ${freeMem}`
#echo $(usagePercent ${usedMem} ${totalMem})
#echo $(kbToGb ${totalMem})
logInfo "Host [${ip}] total mem is : $(kbToGb ${totalMem}) GB"
#计算内存使用率并打印到日志中
logInfo "Host [${ip}] mem usage is : $(usagePercent ${usedMem} ${totalMem}) %"
logInfo "End to get mem usage of Host [${ip}]"
} #网卡平均每秒流量
function netData(){
logInfo "Begin to get net data of Host [${ip}]"
ethName=$
receiveByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
sendByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
sleep
receiveByteSEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
sendBytesEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
inDataRate=$(echo "scale=2;(${receiveByteSEnd}-${receiveByteStart})/10" | bc)
outDataRate=$(echo "scale=2;(${sendBytesEnd}-${sendByteStart})/10" | bc)
logInfo "Host [${ip}] in data is : ${inDataRate} kb / s"
logInfo "Host [${ip}] out data is : ${outDataRate} kb / s"
logInfo "End to get net data of Host [${ip}]"
} #磁盘空间使用情况
function diskUsage(){
logInfo "Begin to get disk usage of Host [${ip}]"
noTimeLogInfo "`df -h`"
logInfo "End to get disk usage of Host [${ip}]"
} #disk IO in
function diskIOIn(){
#获取磁盘入方向IO
inIoStart=`awk '/pgpgin/{print $2}' /proc/vmstat`
sleep
inIoEnd=`awk '/pgpgin/{print $2}' /proc/vmstat`
inIo=$(((inIoEnd-inIoStart)/(*)))
logInfo "Host [${ip}] in IO is : ${inIo} MB / s" } #disk IO out
function diskIOout(){
#获取磁盘出方向的IO
outIoStart=`awk '/pgpgout/{print $2}' /proc/vmstat`
sleep
outIoEnd=`awk '/pgpgout/{print $2}' /proc/vmstat`
outIo=$(((outIoEnd-outIoStart)/(*)))
logInfo "Host [${ip}] out IO is : ${outIo} MB / s"
} #当前在线用户
function onlineUser(){
user=`w |awk 'NR>1'|awk '{print $1 "\t" "\t" $4}'`
userCount=`w |awk 'NR>1'|wc -l`
#loginAt=`w |awk 'NR>1'|awk '{print $4 }'`
logInfo "There are [${userCount}] users online now."
noTimeLogInfo "UserName loginAt"
noTimeLogInfo "${user}"
} #判断主机网络连通性
function isAlive(){
for ip in `cat hostLists`
do
ping ${ip} -c >/dev/null
if [ $? -eq ];then
logInfo "${ip} is reachable"
#查看在线用户
onlineUser
#获取CPU相关信息
cpuUsage
#获取mem相关信息
memUsage
#获取磁盘IO
diskIOIn
diskIOout
#磁盘使用率
diskUsage
#平均每秒流接收或输出流量
netData wlp3s0
else
logInfo "ERROR ${ip} is unreachable,try login in see more details.."
fi
done
} while [ ]
do
isAlive
sleep
done
  • utils:打印日志的函数等。
 #!/bin/bash
#日志打印
curr_path=`pwd`
function logInfo()
{
local curr_time=`date "+%Y-%m-%d %H:%M:%S"`
log_file=${curr_path}/system_status.log
#判断日志文件是否存在
if [ -e ${log_file} ]
then
#检测文件是否可写
if [ -w ${log_file} ]
then
#若文件无写权限则使用chmod命令赋予权限
chmod ${log_file}
fi
else
#若日志文件不存在则创建
touch ${log_file}
fi
#写日志
local info=$
echo "${curr_time} `whoami` [Info] ${info}">>${log_file}
}
function noTimeLogInfo(){
msg=$
echo "${msg}">>${log_file}
} #把kb转换成gb,精度为3。expr只支持整数计算
function kbToGb(){
kbVal=$
gbVal=$(echo "scale=3;${kbVal}/1024/1024"| bc)
echo $gbVal
}
#使用率以百分比的形式
#第一个参数为已使用量,第二个参数为总量
function usagePercent(){
used=$
total=$
usedPercent=$(echo "scale=2;${used}*100/${total}"| bc)
echo ${usedPercent}
}

脚本结构:

 -rw-r--r--  stephen stephen    4月    : hostLists
-rwxrwxr-x stephen stephen 4月 : sysMonitor.sh*
-rw-r--r-- stephen stephen 4月 : utils

4、运行结果

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

-- ::  stephen [Info] 192.168.1.109 is reachable
-- :: stephen [Info] There are [] users online now.
UserName loginAt
USER LOGIN@
stephen :
-- :: stephen [Info] Host [192.168.1.109] physical CPU nums is :
-- :: stephen [Info] Host [192.168.1.109] logic CPU nums is :
-- :: stephen [Info] Host [192.168.1.109] core nums is :
-- :: stephen [Info] Host [192.168.1.109] CPU usage is : 10.12 %
-- :: stephen [Info] Begin to get mem usage of Host [192.168.1.109]
-- :: stephen [Info] Host [192.168.1.109] total mem is : 3.741 GB
-- :: stephen [Info] Host [192.168.1.109] mem usage is : 95.83 %
-- :: stephen [Info] End to get mem usage of Host [192.168.1.109]
-- :: stephen [Info] Host [192.168.1.109] in IO is : MB / s
-- :: stephen [Info] Host [192.168.1.109] out IO is : MB / s
-- :: stephen [Info] Begin to get disk usage of Host [192.168.1.109]
文件系统 容量 已用 可用 已用% 挂载点
udev .9G .9G % /dev
tmpfs 384M 2.0M 382M % /run
/dev/sda10 42G 20G 20G % /
tmpfs .9G 20M .9G % /dev/shm
tmpfs 5.0M .0K 5.0M % /run/lock
tmpfs .9G .9G % /sys/fs/cgroup
/dev/loop0 3.8M 3.8M % /snap/notepad-plus-plus/
/dev/loop2 54M 54M % /snap/core18/
/dev/loop4 441M 441M % /snap/wine-platform/
/dev/loop5 441M 441M % /snap/wine-platform/
/dev/loop7 3.8M 3.8M % /snap/notepad-plus-plus/
/dev/loop3 90M 90M % /snap/core/
/dev/loop1 274M 274M % /snap/wps-office-multilang/
/dev/loop6 91M 91M % /snap/core/
/dev/loop8 92M 92M % /snap/core/
/dev/loop9 36M 36M % /snap/gtk-common-themes/
/dev/loop10 3.8M 3.8M % /snap/notepad-plus-plus/
/dev/loop11 441M 441M % /snap/wine-platform/
tmpfs 384M 16K 384M % /run/user/
tmpfs 384M 52K 384M % /run/user/
-- :: stephen [Info] End to get disk usage of Host [192.168.1.109]
-- :: stephen [Info] Begin to get net data of Host [192.168.1.109]
-- :: stephen [Info] Host [192.168.1.109] in data is : 42.90 kb / s
-- :: stephen [Info] Host [192.168.1.109] out data is : 7.00 kb / s
-- :: stephen [Info] End to get net data of Host [192.168.1.109]
-- :: 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. JAVA基础复习与总结<六> 数组_容器_泛型

    数组的常用方法 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: 给数组赋值:通过 fill 方法. 对数组排序:通过 sort 方法,按升序. 比较 ...

  2. java自动化-实际使用junit的演示

    本文简单介绍一下我写的http接口后端框架 在经过之前多篇博客介绍之后,读者应掌握如下技能 1,自动运行一个或者多个junit框架编写的java代码 2,对数据驱动以及关键字驱动有一定的了解和认识,甚 ...

  3. HFS 轻量化 的文件服务器

    国外的工具 国内的工具

  4. 解决win10 报错 git pull error: cannot open .git/FETCH_HEAD: Permission denied

    sh配置git 用户解决了 git config --list //查看当前的config配置 git config --global user.name "youruser" / ...

  5. sudo命令详解

    语法 sudo(选项)(参数) 选项 选项 说明 -b 在后台执行指令: -h 显示帮助: -H 将HOME环境变量设为新身份的HOME环境变量: -k 结束密码的有效期限,也就是下次再执行sudo时 ...

  6. 关于Python2 与 Python3 的区别

    Python是一门动态解释性的强类型定义语言. 1.Python2 : ①.臃肿,源代码的重复量很多.   ②.语法不清晰,掺杂着C,php,Java的一些陋习. Python3 : 几乎是重构后的源 ...

  7. 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...

  8. django(models)视图与html 简单的操作

    !数据提前写好 urls映射图 点击a标签之后

  9. UML建模工具

    UML:Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段 ...

  10. maven_SSM集成的demo

    一.集成spring 二.集成springMVC 三.集成mybatis 1. pom.xml <?xml version="1.0" encoding="UTF- ...