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

一、cpu信息采集

1).采集cpu使用率

采集算法:通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率。以cpu0为例,算法如下:
1. cat /proc/stat | grep ‘cpu0'得到cpu0的信息
2. cpuTotal1=user+nice+system+idle+iowait+irq+softirq
3. cpuUsed1=user+nice+system+irq+softirq
4. sleep 30秒
5. 再次cat /proc/stat | grep 'cpu0' 得到cpu的信息
6. cpuTotal2=user+nice+system+idle+iowait+irq+softirq
7. cpuUsed2=user+nice+system+irq+softirq
8. 得到cpu0 在30秒内的单核利用率:(cpuUsed2 – cpuUsed1) * 100 / (cpuTotal2 – cpuTotal1)
相当于使用top –d 30命令,把user、nice、system、irq、softirq五项的使用率相加。
shell代码:


代码如下:

a=(`cat /proc/stat | grep -E "cpu\b" | awk -v total=0 '{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}'`)
sleep 30
b=(`cat /proc/stat | grep -E "cpu\b" | awk -v total=0 '{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}'`)
cpu_usage=(((${b[1]}-${a[1]})*100/(${b[0]}-${a[0]})))

2).采集cpu负载

采集算法:读取/proc/loadavg得到机器的1/5/15分钟平均负载,再乘以100。
shell代码:


代码如下:

cpuload=(`cat /proc/loadavg | awk '{print $1,$2,$3}'`)
load1=${cpuload[0]}
load5=${cpuload[1]}
load15=${cpuload[2]}

二、内存采集

1).应用程序使用内存
采集算法:读取/proc/meminfo文件,(MemTotal – MemFree – Buffers – Cached)/1024得到应用程序使用内存数。
shell代码:


代码如下:

awk '/MemTotal/{total=$2}/MemFree/{free=$2}/Buffers/{buffers=$2}/^Cached/{cached=$2}END{print (total-free-buffers-cached)/1024}'  /proc/meminfo

2).MEM使用量
采集算法:读取/proc/meminfo文件,MemTotal – MemFree得到MEM使用量。
shell代码:


代码如下:

awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024}'  /proc/meminfo

3).SWAP使用大小
采集算法:通过/proc/meminfo文件,SwapTotal – SwapFree得到SWAP使用大小。
shell代码:


代码如下:

awk '/SwapTotal/{total=$2}/SwapFree/{free=$2}END{print (total-free)/1024}'  /proc/meminfo

三、磁盘信息采集(disk io)

1、IN:平均每秒把数据从硬盘读到物理内存的数据量
采集算法:读取/proc/vmstat文件得出最近240秒内pgpgin的增量,把pgpgin的增量再除以240得到每秒的平均增量。
相当于vmstat 240命令bi一列的输出。
shell代码:


代码如下:

a=`awk '/pgpgin/{print $2}' /proc/vmstat`
sleep 240
b=`awk '/pgpgin/{print $2}' /proc/vmstat`
ioin=$(((b-a)/240))

2、OUT:平均每秒把数据从物理内存写到硬盘的数据量

采集算法:读取/proc/vmstat文件得出最近240秒内pgpgout的增量,把pgpgout的增量再除以240得到每秒的平均增量。
相当于vmstat 240命令bo一列的输出。
shell代码:


代码如下:

a=`awk '/pgpgout/{print $2}' /proc/vmstat`
sleep 240
b=`awk '/pgpgout/{print $2}' /proc/vmstat`
ioout=$(((b-a)/240))

四、网络

1).流量
以http://www.jb51.net/为例,eth0是内网,eth1外网,获取60秒的流量。
机器网卡的平均每秒流量
采集算法:读取/proc/net/dev文件,得到60秒内发送和接收的字节数(KB),然后乘以8,再除以60,得到每秒的平均流量。
shell代码:


代码如下:

traffic_be=(`awk 'BEGIN{ORS=" "}/eth0/{print $2,$10}/eth1/{print $2,$10}' /proc/net/dev`)
sleep 60
traffic_af=(`awk 'BEGIN{ORS=" "}/eth0/{print $2,$10}/eth1/{print $2,$10}' /proc/net/dev`)
eth0_in=$(( (${traffic_af[0]}-${traffic_be[0]})/60 ))
eth0_out=$(( (${traffic_af[1]}-${traffic_be[1]})/60 ))
eth1_in=$(( (${traffic_af[2]}-${traffic_be[2]})/60 ))
eth1_out=$(( (${traffic_af[3]}-${traffic_be[3]})/60 ))

2).包量
机器网卡的平均每秒包量
采集算法:读取/proc/net/dev文件,得到60秒内发送和接收的包量,然后除以60,得到每秒的平均包量。
shell代码:


代码如下:

packet_be=(`awk 'BEGIN{ORS=" "}/eth0/{print $3,$11}/eth1/{print $3,$11}' /proc/net/dev`)
sleep 60
packet_af=(`awk 'BEGIN{ORS=" "}/eth0/{print $3,$11}/eth1/{print $3,$11}' /proc/net/dev`)
eth0_in=$(( (${packet_af[0]}-${packet_be[0]})/60 ))
eth0_out=$(( (${packet_af[1]}- ${packet_be[1]})/60 ))
eth1_in=$(( (${packet_af[2]}- ${packet_be[2]})/60 ))
eth1_out=$(( (${packet_af[3]}- ${packet_be[3]})/60 ))

(0)

相关推荐

  • Shell脚本实现把进程负载均衡到多核CPU中

    有时候,由于架构设计或其他业务本身特点原因,导致有些应用使用CPU很不均衡,所以业务处理集中在一个CPU上,而其它CPU闲得在睡觉.这里有个简单的优化方案实现将各个线程绑定到到多个CPU,从而实现性能的提高. 虽然CPU是一个不错的思路,但是不是杀手锏,其性能能提高多少依赖于各个线程的性能分布是否均匀:所以最好的办法是优化你的程序架构. 在这里分享一个Shell脚本(脚本名为bindcpu2p.sh),通过该脚本可将该进程均匀负载到各个CPU上. 复制代码 代码如下: #!/bin/sh pid

  • 统计 cpu 内存 使用率的shell脚本代码

    复制代码 代码如下: #!/bin/shclearwhile ((1>0))do NET=$(netstat -anp | grep 1000 | grep EST | wc -l) PRC=$(ps aux | grep thread1 | grep -v grep | grep -v SCREEN | awk '{ print " CPU: " $3 "%,  MEM: " $4 "%, RSS: " $6/1024 "M,

  • 消耗CPU资源的shell脚本

    复制代码 代码如下: #! /bin/sh  # filename killcpu.sh if [ $# != 1 ] ; then   echo "USAGE: $0 <CPUs>"  exit 1; fifor i in `seq $1` do  echo -ne "  i=0;  while true do i=i+1;  done" | /bin/sh &   pid_array[$i]=$! ; done for i in "

  • 自动杀掉占用较多CPU资源的Shell脚本

    复制代码 代码如下: #!/bin/bash # March-13-2006# CPUuse trigger script by Noel## bash code to watch a running program's CPU usage.# if it's above a set value, it will auto send an email.# You will need to set a Cron job to run this script every xx minutes## S

  • Linux中使用Shell脚本查看Java线程的CPU使用情况

    线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名. 一.首先获得jvm的进程ID: 复制代码 代码如下: ps -ef|grep javatomcat     374   372  1 11:45 ?        00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile

  • Linux shell脚本实现CPU预警

    如果CPU占用率持续达到80以上则调用打印java线程占用率堆栈的脚本,见https://github.com/oldratlee/useful-shells/blob/master/show-busy-java-threads.sh,具体用法见他的github wiki! #!/bin/bash #cpu idle percent cpu_idle=`top -b -d 1 -n 2 | grep Cpu | awk 'NR>1{print $5}' | cut -f 1 -d ".&q

  • shell脚本监控系统负载、CPU和内存使用情况

    在没有nagios监控软件的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统负载与CPU占用的使用情况. 一.安装linux下面的一个邮件客户端msmtp软件(类似于一个foxmail的工具) 1.下载安装:  http://downloads.sourceforge.net/msmtp/msmtp-1.4.16.tar.bz2?modtime=1217206451&big_mirror=0 复制代码 代码如下: # tar jxvf msmtp-1.4.16.tar.bz2

  • 一个用了统计CPU 内存 硬盘 使用率的shell脚本

    复制代码 代码如下: #!/bin/bash#This script is use for describle CPU Hard Memery Utilizationtotal=0idle=0system=0user=0nice=0mem=0vmexec=/usr/bin/vmstatwhich sar > /dev/null 2>&1if [ $? -ne 0 ]then  ver=`vmstat -V | awk '{printf $3}'`  nice=0  temp=`vmst

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

    一.cpu信息采集 1).采集cpu使用率 采集算法:通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率.以cpu0为例,算法如下:1. cat /proc/stat | grep 'cpu0'得到cpu0的信息2. cpuTotal1=user+nice+system+idle+iowait+irq+softirq3. cpuUsed1=user+nice+system+irq+softirq4. sleep 30秒5. 再次cat /proc/stat | grep 'cp

  • shell脚本快速创建格式化磁盘与详细操作步骤

    这篇文章给大家介绍如何利用shell脚本实现对一个磁盘进行分区格式化挂载,具体内容如下所示: 查看当前磁盘分区状况 查看当前磁盘的一个分区状况,使用命令:fdisk -l fdisk -l //查看磁盘信息 lsblk 让硬盘进入分区模式 fdisk /dev/sdb 命令(输入 m 获取帮助): m //打印选项菜单 添加新的分区: 命令(输入 m 获取帮助):n //添加一个分区 选择分区类型: Select (default p): e //输入e表示创建扩展分区 分区数量: 分区号 (1

  • Shell脚本实现检测某ip网络畅通情况(含短信报警功能)

    花了1天的时间写了一个检测某ip是否网络畅通的脚本,只检测网络是否畅通的功能很容易实现,但加了一些限制功能却不好实现. 复制代码 代码如下: #!/bin/bash #################################################################################### #本脚本放于异机,使用定时任务检测192.168.10.231是否网络畅通,如果不通则发短信告警  #为防止频繁收到短信,对发送短信做了如下限制:         

  • Shell脚本查看进程内存真实占用情况

    复制代码 代码如下: #!/bin/bash #****************************************************************# # ScriptName: pm # Author: osdba # Create Date: 2010-01-31 # Modify Author: # Modify Date: 2010-01-31 # Function: show processes memory used #******************

  • bash脚本如何监控cup/内存/磁盘使用率

    目录 查看消耗内存最多的前40个进程: 自动任务做一个基础资源告警脚本 利用free工具监控内存利用率,超过80报警并提取出占用内存最高的前十进程. 利用df命令监控磁盘利用率,超过80报警. 这篇博客中所写的,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控.不过自己写一遍,可以让初学者对CPU.内存.磁盘等一些基础知识和基础命令更加了解. #!/bin/bash #获取内存情况 mem_total=`free | awk 'NR==2{print $2}'` #获取内存总大小 me

  • shell脚本自动检测网络掉线和自动重连

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的shell类型来选择. while true //先做一个死循环 do ping -c 3 -I ppp0 172.16.1.11 >/dev/null //指定一个出口去ping服务器的局域网ip,将结果重定向到/dev/null里. //-c 3 是指ping执行3次后结束. //-w 3 是指pin

  • shell脚本实现磁盘监控系统

    利用shell脚本实现每隔60秒磁盘内存数据监控 #!/bin/bash #Author:GaoHongYu #QQ:1061767621 #Time:2019-12-24 18:43:22 #Name:ncjk.sh #Version:V1.0 clear xtip=$(hostname -I) cprl=$(df -Th |head -2|tail -1|cut -d " " -f 10) cpky=$(df -Th |head -2|tail -1|cut -d " &

  • Linux内存泄漏检测shell脚本

    本文实例为大家分享了Linux内存泄漏检测的shell脚本,供大家参考,具体内容如下 #!/bin/sh if [ $# -ne 1 ]; then echo "Usage: `basename $0` process_name" exit 1 fi APPNAME=$1 PROC="`ps -ef | grep "$APPNAME" | grep -v "grep" | grep -v "awk" | grep -

  • 监视磁盘使用情况的Shell脚本(本地+远程)

    monitordisk.sh如下 复制代码 代码如下: #!/bin/bash #Updated:2008-03-03 PM By:leif(liangliwen@163.com) EMAIL=/usr/local/bin/email /bin/df -h >/tmp/df.txt USE=`df -H | grep -o [0-9]*% | grep -o '[0-9]\+'` for i in $USE do if (( $i > 95 )) then $EAMIL -s "WA

随机推荐