shell实战之Linux主机系统监控
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主机系统监控的更多相关文章
- Linux 服务器系统监控脚本 Shell【转】
转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...
- Day 7 Linux之系统监控、硬盘分区等
Linux之系统监控.硬盘分区等 系统监控 系统监视和进程控制工具—top和free 1) 掌握top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况, ...
- zabbix入门到精通之Zabbix对linux主机的监控
我们大概了解了怎么对台主机进行监控,主要步骤设计到添加主机,并且为主机添加监控项,这里主要为item,然后在item的基础上对item进行绘图并且通过screen的方式把不同的监控图像汇总到一张scr ...
- linux常用系统监控命令
原文:http://blog.sina.com.cn/s/blog_68f1c17001016uvy.html Linux提供了很多用于监控系统的工具,使用这些工具可以找到导致系统性能降低的瓶颈.系统 ...
- Linux基础——系统监控
系统监视和进程控制工具——top(任务管理器) top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 各行数据大致解释如下: 12: ...
- shell:实现linux服务器资源监控并发送告警邮件
1.安装方式 wget http://10.8.225.126/wsmonitor/install.sh;sh install.sh test@test.com 2.install.sh #!/bin ...
- 用shell脚本挂载linux主机拷贝相应文件copy.sh
#!/bin/sh # $1 MOUNTDIR $2 TARGETDIR $3 ERRORLOG #参数检查 if test $# -ne 3 then echo "argument che ...
- 用shell脚本挂载linux主机拷贝相应文件
#!/bin/sh TARGETIP=192.168.88.3 #这里是你要挂在的ftp服务器的IP地址 MOUNTDIR=/mnt TARGETDIR=/root/Desktop/Work ERRO ...
- Shell 脚本实现 Linux 系统监控
一.实验介绍 1.1 实验内容 本课程实现 shell 脚本监控系统的各项参数,并可以将脚本加入系统环境中,可以直接在终端里执行.还添加了几个参数,一个脚本可以执行不同的操作. 1.2 知识点 本实验 ...
随机推荐
- 1062 Text Reverse
http://acm.hdu.edu.cn/showproblem.php?pid=1062 思路: 最主要的是通过getline函数存取字符串. 如何读取单个单词,并且反向输出? 用\n作为单个单词 ...
- thrift小试--C++
[转自]http://blog.csdn.net/poechant/article/details/6618284# Thrift可以实现C++.Java.Python等多种语言的自动生成,此处以C+ ...
- linux磁盘满了的处理
1.查看磁盘使用情况 cd / df -h 如果 总量Size和Used一样,按就证明磁盘满了 2.查看当前文件下每个文件大小 du -sh * 一层一层去查,就可以查到占用空间最大的那个文件及产生 ...
- 使用curl上传图片的方法
关键:当参数名为"@绝对路径",这时 CURL 會幫你做 multipart/form-data 編碼 实现方法: $params = array( 'file' => '@ ...
- python学习笔记(4)
.................................................................................................... ...
- vue中添加title中的小图标
webpack.prod.conf.js 这个文件中: 引入代码const path = require('path') :下面是进行配置: new HtmlWebpackPlugin({ filen ...
- Linux 搭建Nginx+uWSGI+Django环境
安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...
- aspnet core2中使用csp内容安全策略
aspnet core2中使用csp内容安全策略 问题:aspnet core2如何使用csp防止xss的攻击 方法: public void ConfigureServices( IServiceC ...
- [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)
星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...
- javascript 省市区三级联动 附: json数据
html: <label> <span>购买地址</span> <select name="PurchaseProvince" style ...