比较粗略的一个脚本:主要监控系统磁盘、CPU、内存、网络流量、tcp连接数等

代码如下:

[root@test system_monitor_shell_script]# cat system_monitor.sh
#!/bin/bash
#. /home/hduser/modify_system_variable.sh
. /data/script_ssh/system_monitor_shell_script/modify_system_variable.sh
#1、系统基本信息
################################################################
echo -e "\033[32m############# 系统时间 #############\033[0m"
echo System_Now_Time: `date "+%Y-%m-%d %H:%M:%S"`
#获取系统时间也可以使用who -b
echo System_Boot_Time: `date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"`
echo -e "\033[32m############ 主机名 ###############\033[0m"
echo Hostname: `hostname` echo -e "\033[32m########## Ip地址和网卡流量 ##########\033[0m"
#获取服务器的网卡和IP地址,以便在网卡流量监控时使用。 for Network in `ifconfig |awk -F : '/^[[:alpha:]]/{print $1}'`
do
FLOWA=/tmp/.$Network
grep $Network: /proc/net/dev|awk -F: '{print $2}'|awk '{print "INPUT " $1 " " "OUTPUT " $9}' > $FLOWA
#第一次获取网卡流量,单位字节
INPUTA=`awk '{print $2}' $FLOWA`
OUTPUTA=`awk '{print $4}' $FLOWA`
#获取网卡流量间隔时间
sleep $NETTIME
#第二次获取网卡流量,单位字节
grep $Network: /proc/net/dev|awk -F: '{print $2}'|awk '{print "INPUT " $1 " " "OUTPUT " $9}' > $FLOWA
INPUTB=`awk '{print $2}' $FLOWA`
OUTPUTB=`awk '{print $4}' $FLOWA`
#计算
#转换网卡流量单位为KB
INPUTC=`echo -e "$INPUTB-$INPUTA" | bc`
OUTPUTC=`echo -e "$OUTPUTB-$OUTPUTA"| bc`
INPUTMBA=`echo -e $INPUTC |awk '{printf "%0.3f\n",$1/1024}'`
OUTPUTMBA=`echo -e $OUTPUTC |awk '{printf "%0.3f\n",$1/1024}'`
INPUT=`echo -e $INPUTC |awk '{printf "%0.3f\n",$1/1024/1024}'`
OUTPUT=`echo -e $OUTPUTB |awk '{printf "%0.3f\n",$1/1024/1204}'`
#判断网卡流量使用量
if [ $INPUTC -le 1048576 ];then
if [ $OUTPUTC -le 1048576 ];then
echo Network_Card: $Network Ip: `/sbin/ifconfig $Network|grep "inet "|awk '{print $2}'` "输入流量: " ${INPUTMBA}K/S "输出流量: " "${OUTPUTMBA}K/S "
else
echo Network_Card: $Network Ip: `/sbin/ifconfig $Network|grep "inet "|awk '{print $2}'` "输入流量: " ${INPUTMBA}K/S "输出流量: " "${OUTPUT}M/S "
fi
elif [ $INPUTC -gt 1048576 ];then
if [ $OUTPUTC -gt 1048576 ];then
echo Network_Card: $Network Ip: `/sbin/ifconfig $Network|grep "inet "|awk '{print $2}'` "输入流量: " ${INPUT}M/S "输出流量: " "${OUTPUTMBA}K/S "
else
echo Network_Card: $Network Ip: `/sbin/ifconfig $Network|grep "inet "|awk '{print $2}'` "输入流量: " ${INPUT}M/S "输出流量:" "${OUTPUT}M/S "
fi
fi
done #2、CPU监控
##############################################################
echo -e "\033[32m############### CPU平均负载和系统进程数 ##############\033[0m"
#us(user time):用户进程执行消耗cpu时间;sy(system time):系统进程执行消耗cpu时间;id:空闲时间(包括IO等待时间);wa:等待IO时间。
#CPULIMIT=90
CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p')
CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p')
CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p')
CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p')
CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p')
#计算服务器CPU使用率
CPU1=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
sleep $CPUTIME
CPU2=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
IDLE1=`echo -e $CPU1 | awk '{print $4}'`
IDLE2=`echo -e $CPU2 | awk '{print $4}'`
CPU1_TOTAL=`echo -e $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
CPU2_TOTAL=`echo -e $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
IDLE=`echo -e "$IDLE2-$IDLE1" | bc`
CPU_TOTAL=`echo -e "$CPU2_TOTAL-$CPU1_TOTAL" | bc`
RATE=`echo -e "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}'` echo "用户进程占用CPU时间: us=$CPU_us" ; echo "系统进程消耗CPU时间: sy=$CPU_sy";
echo "CPU空闲时间: id=$CPU_id" ; echo "等待I/O时间: wa=$CPU_wa";
echo "CPU使用率: ${RATE}%"
CPU_RATE=`echo -e $RATE | cut -d. -f1`
load_average=$(uptime |gawk -F':' '{print $NF}')
running_process=$(top -b -d 1 -n 1 |sed -n '2p' |awk -F',' '{print $2}' |awk '{print $1}')
#running_process=`ps aux |wc -l`
total_process=$(ps -ef |wc -l)
echo
echo "CPU_load_average: ${load_average}"
echo "running_process:"" " ${running_process}
echo "total_process:"" " ${total_process} Host_running_time=$(uptime |sed 's/^.*up//' | awk -F "," '{print $1}')
User_connection_number=$(uptime |cut -d , -f 3|awk '{print $1}')
#cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒\n",run_days,run_hour,run_minute,run_second)}'
echo -e "Host_running_time: `cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("%d天%d时%d分%d秒\n",run_days,run_hour,run_minute,run_second)}'`"
echo -e "User_connection_number: ${User_connection_number}\n"
#CPU占用最多的十个进程
CPUA=`expr $RATE \> $CPULIMIT`
if [ $CPUA -eq 1 ];then
echo "$time1 CPU警告:当前CPU使用率$RATE%,大于$CPULIMIT%"; echo \ ;
echo "process使用CPU情况:"
ps aux |sort -k3nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%CPU","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$3,$11}'
fi
echo #3、内存监控
####################################################################
echo -e "\033[32m########### 系统内存使用情况 ##############\033[0m"
#内存使用情况
#MEMLIMIT=80
Total_Mem=$(free -m |sed -n '2p' |awk '{print $2}')
Usage_Mem=$(free -m |sed -n '2p' |awk '{print $3}')
Free_Mem=$(free -m |sed -n '2p' |awk '{print $4}')
Mem_Usage_Percent=`free -m |sed -n '2p'|awk '{printf "%-1d",$3/$2*100}'`
#交换分区使用情况
Swap_Total_Mem=$(free -m |grep Swap |sed -n 'p' |awk '{print $2}')
Swap_Usage_Mem=$(free -m |grep Swap |sed -n 'p' |awk '{print $3}')
Swap_Free_Mem=$(free -m |grep Swap |sed -n 'p' |awk '{print $4}')
Swap_Mem_Usage_Percent=`free -m |grep Swap|sed -n 'p'|awk '{printf "%-1d",$3/$2*100}'`
echo "总内存:"${Total_Mem}M
echo "使用内存: ${Usage_Mem}M"; echo "剩余内存: ${Free_Mem}M"
echo -e "内存使用率: ${Mem_Usage_Percent}%\n"
echo "交换分区使用情况:"
echo "总内存: ${Swap_Total_Mem}M" ;echo "使用内存: ${Swap_Usage_Mem}M"
echo "剩余内存: ${Swap_Free_Mem}M";echo -e "使用率: ${Swap_Mem_Usage_Percent}%\n"
#判断内存使用是否超过80%
MA=`expr $Mem_Usage_Percent \> $MEMLIMIT`
if [ $MA -eq 1 ];then
echo "$time1 内存警告,当前内存使用$Mem_Usage_Percent% 大于$MEMLIMIT%"
fi MB=`expr $Swap_Mem_Usage_Percent \> $MEMLIMIT`
if [ $MB -eq 1 ];then
echo "$time1 内存警告,当前内存$Swap_Mem_Usage_Percent% 大于$MEMLIMIT%"
fi
echo "process使用内存情况:"
ps aux |sort -k4nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}'
#PCPID=`ps aux |sort -k4nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}' |grep -v -i user |awk '{print $2}'`
#PDMEM=`ps aux |sort -k4nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}' |grep -v -i user |awk '{print $3}'`
#for i in $PCPID
#do
# echo $i;ps -ef |grep $i |awk '{print $NF}' |head -1
#done
echo
#4、磁盘监控
#################################################################
#ROOT=80
#VAR=90
#HOME=90
#BOOT=80
#DATA=90
NULL=/dev/null
echo -e "\033[32m############### 磁盘使用情况 ################\033[0m"
disk=/tmp/.disk
#parted适用于Ubuntu
#parted -l |grep -i 'disk' |grep '/dev/[a-z]d[a-z]' |awk -F: '{print $1}' |awk '{print $2}' > /tmp/.disknumber
#/sbin/fdisk -l |grep -i 'disk' |grep '/dev/[a-z]d[a-z]' |awk -F: '{print $1}' |awk '{print $2}' > /tmp/.disknumber
disk_data_usage=`df -h |grep "data$" |awk '{print $5}'|awk -F% '{print $1}'`
disk_root_usage=`df -h |grep "/$" |awk '{print $5}'|awk -F% '{print $1}'`
disk_home_usage=`df -h |grep "home$" |awk '{print $5}'|awk -F% '{print $1}'`
disk_var_usage=`df -h |grep "var" |awk '{print $5}'|awk -F% '{print $1}'`
disk_boot_usage=`df -h |grep "boot" |awk '{print $5}'|awk -F% '{print $1}'`
disk_data2_usage=`df -h |grep "data2" |awk '{print $5}'|awk -F% '{print $1}'`
disk_data3_usage=`df -h |grep "data3" |awk '{print $5}'|awk -F% '{print $1}'`
disk_data4_usage=`df -h |grep "data4" |awk '{print $5}'|awk -F% '{print $1}'`
disk_data5_usage=`df -h |grep "data5" |awk '{print $5}'|awk -F% '{print $1}'`
#获取磁盘分区使用情况
df -h |awk '{print $NF}' > /tmp/.disk
grep home $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_home_usage -ge $HOME ];then
echo " "/home分区警告:当前使用$disk_home_usage%,大于$HOME
else
echo " "当前/home分区使用:" "$disk_home_usage%
fi
fi
grep "/$" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_root_usage -ge $ROOT ];then
echo " "/分区警告:当前使用$disk_root_usage%,大于$ROOT
else
echo " "当前/分区使用:" "$disk_root_usage%
fi fi
grep "var" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_var_usage -ge $VAR ];then
echo " "/var分区警告:当前使用$disk_var_usage%,大于$VAR
else
echo " "当前/var分区使用:" "$disk_var_usage%
fi fi
grep "boot" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_boot_usage -ge $BOOT ];then
echo " "/boot分区警告:当前使用$disk_boot_usage%,大于$BOOT
else
echo " "当前/boot分区使用:" "$disk_boot_usage%
fi
fi
grep "data" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_data_usage -ge $DATA ];then
echo " "/data分区警告:当前使用$disk_data_usage%,大于$DATA
else
echo " "当前/data分区使用:" "$disk_data_usage%
fi
fi
grep "data2" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_data2_usage -ge $DATA ];then
echo " "/data2分区警告:当前使用$disk_data2_usage%,大于$DATA
else
echo " "当前/data2分区使用:" "$disk_data2_usage%
fi
fi
grep "data3" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_data3_usage -ge $DATA ];then
echo " "/data3分区警告:当前使用$disk_data3_usage%,大于$DATA
else
echo " "当前/data3分区使用:" "$disk_data3_usage%
fi
fi
grep "data4" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_data4_usage -ge $DATA ];then
echo " "/data4分区警告:当前使用$disk_data4_usage%,大于$DATA
else
echo " "当前/data4分区使用:" "$disk_data4_usage%
fi
fi
grep "data5" $disk > $NULL
if [ $? -eq 0 ];then
if [ $disk_data5_usage -ge $DATA ];then
echo " "/data5分区警告:当前使用$disk_data5_usage%,大于$DATA
else
echo " "当前/data5分区使用:" "$disk_data5_usage%
fi
fi
echo #5、连接数
######################################################################
tcpfile=/tmp/.tcp
#查看并发连接数
#描述
#CLOSED:无连接是活动的或正在进行
#LISTEN:服务器在等待进入呼叫
#SYN_RECV:一个连接请求已经到达,等待确认
#SYN_SENT:应用已经开始,打开一个连接
#ESTABLISHED:正常数据传输状态
#FIN_WAIT1:应用说它已经完成
#FIN_WAIT2:另一边已同意释放
#ITMED_WAIT:等待所有分组死掉
#CLOSING:两边同时尝试关闭
#TIME_WAIT:另一边已初始化一个释放
#LAST_ACK:等待所有分组死掉
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' > $tcpfile
grep TIME_WAIT $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "TIME_WAIT 0 " >> $tcpfile
fi
grep FIN_WAIT1 $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "FIN_WAIT1 0 " >> $tcpfile
fi
grep FIN_WAIT2 $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "FIN_WAIT2 0 " >> $tcpfile
fi
grep CLOSE_WAIT $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "CLOSE_WAIT 0 " >> $tcpfile
fi
grep LAST_ACK $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "LAST_ACK 0 " >> $tcpfile
fi
grep SYN_RECV $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "SYN_RECV 0 " >> $tcpfile
fi
grep CLOSING $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "CLOSING 0 " >> $tcpfile
fi
grep ESTABLISHED $tcpfile > $NULL
if [ $? -eq 1 ] ; then
echo "ESTABLISHED 0 " >> $tcpfile
fi TIME_WAITV=`grep TIME_WAIT $tcpfile | awk '{print $2}'`
FIN_WAIT1V=`grep FIN_WAIT1 $tcpfile | awk '{print $2}'`
FIN_WAIT2V=`grep FIN_WAIT2 $tcpfile | awk '{print $2}'`
ESTABLISHEDV=`grep ESTABLISHED $tcpfile | awk '{print $2}'`
SYN_RECVV=`grep SYN_RECV $tcpfile | awk '{print $2}'`
CLOSINGV=`grep CLOSING $tcpfile | awk '{print $2}'`
CLOSE_WAITV=`grep CLOSE_WAIT $tcpfile | awk '{print $2}'`
LAST_ACKV=`grep LAST_ACK $tcpfile | awk '{print $2}'`
echo -e "\033[32m###########Tcp连接数##################\033[0m"
echo " "当前TIME_WAIT" " 连接数为 $TIME_WAITV 个。
echo " "当前FIN_WAIT1" " 连接数为 $FIN_WAIT1V 个。
echo " "当前FIN_WAIT2" " 连接数为 $FIN_WAIT2V 个。
echo " "当前CLOSE_WAIT" " 连接数为 $CLOSE_WAITV 个。
echo " "当前ESTABLISHED"" 连接数为 $ESTABLISHEDV 个。
echo " "当前SYN_RECV" " 连接数为 $SYN_RECVV 个。
echo " "当前LAST_ACKV" " 连接数为 $LAST_ACKV 个。
echo " "当前CLOSING" " 连接数为 $CLOSINGV 个。; echo \ ;
echo -e "\033[31m ----------------------------END--------------------------\033[0m"
modify_system_variable.sh文件如下
#!/bin/bash
#计算CPU利用率的时间间隔。
CPUTIME=2 # 单位 s
#CPU限制,当系统使用CPU达到下面值时报警。
CPULIMIT=90 #单位 %
#内存限制,当系统使用内存达到下面值时报警。
MEMLIMIT=80 #单位 %
#磁盘监控。 ROOT=80 # / 分区使用限制。单位 %
VAR=90 # var 分区使用限制。 单位 %
HOME=90 # home 分区使用限制。单位 %
BOOT=80 # boot 分区使用限制。 单位 %
DATA=90 # data1 分区使用限制。单位 %
#计算网卡流量时间间隔
NETTIME=3 #单位 s

  

Linux 系统监控shell脚本的更多相关文章

  1. Linux常用的系统监控shell脚本

    http://www.linuxqd.com下面是我常用的几个Linux系统监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助.1.查看主机网卡流量 #!/bin/bash #netw ...

  2. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  3. Linux 性能监控之CPU&内存&I/O监控Shell脚本1

    Linux 性能监控之CPU&内存&I/O监控Shell脚本1   by:授客 QQ:1033553122   #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...

  4. Linux生产服务器Shell脚本分享

    Linux生产服务器Shell脚本分享 2012-6-6 86市场网 linux 作为一名Linux/unix系统管理员,我经常遇到人问这个问题:shell能做什么?PHP这么强大,为什么不用PHP来 ...

  5. python进行linux系统监控

      python进行linux系统监控 Linux系统下: 静态指标信息: 名称 描述 单位 所在文件 mem_total 内存总容量 KB /proc/meminfo disks 磁盘相关信息 - ...

  6. [转]linux 系统监控、诊断工具之 IO wait

    1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...

  7. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...

  8. linux系统监控常用工具

    linux系统监控常用工具 一.系统核心工具包(coreutils) 1./bin/df 报告系统的磁盘空间用量 df -h  显示磁盘分区fdisk -l 2./bin/uname 显示系统信息 u ...

  9. Linux系统监控实用工具Glances

    Linux系统监控实用工具Glances Glances安装 Glances安装要求:python >= 2.6 和 psutil >= 0.4.1 1.第一步,安装了python-> ...

随机推荐

  1. cmake简单用法

    CMake是一个跨平台的编译工具,类似于automake 安装 # cd cmake-2.8.10.2 # ./bootstrap # make # make install project proj ...

  2. Intellij的Terminal框里输入npm无效

    Intellij的Terminal框里输入npm无效,解决办法: 1.安装node.js的时候选择全部安装: 2.在intellij的file->settings->Tools->T ...

  3. git的下载和安装

    Git 安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://g ...

  4. 【Mybatis】缓存

    一.概述 1.1 缓存的意义 1.2 mybatis持久层缓存 二.一级缓存 2.1 原理 2.2 一级缓存配置 一级缓存测试 三.二级缓存 3.1 原理 3.2 mybatis二级缓存配置 3.3 ...

  5. 【Mybatis】 入门

    一.概述 1.1 JDBC 1.2 JDBC编程中问题 1.3 MyBatis介绍 1.4 Mybatis架构 二.MyBatis入门程序 2.1 需求 2.2 引入MyBatis依赖 2.3 配置 ...

  6. C++——inline function

    前言 当代码写复杂后,一定会封装出大量的函数,这会导致两个问题: ①函数越多,栈的消耗也越厉害 疑问:为什么代码复杂了.函数变多了,栈消耗的就很厉害? 答:因为这会导致函数的调用深度可能会很深,比如: ...

  7. 团队高效率协作开发的秘密武器-APIDOC

    团队高效率协作开发的秘密武器 1.前言 在团队协作开发中,不知道各位有没有遇到这样的问题: l 新人接手了项目代码,因没有项目文档,只能靠追踪路由,寻读代码分析业务逻辑 l 前端同学写好了页面,苦等后 ...

  8. springboot中的小技巧

    1.Thymeleaf 在时使用Thymeleaf的时候不用设置html标签:在默认的Thymeleaf的页面中,对于.html的要求比较严格,少写或者多写标签,都会被报错,而在springboot ...

  9. m_strcmp

    strcmp比较两个字符串的大小,strcmp(str1, str2); 从str1和str2的第一个元素比较直到出现不同,或者遇到'\0'结束.如果str1 > str2 返回正数,str1 ...

  10. Airtest---UI自动化测试项目

    Airtest Project是网易游戏团队新开源出来的一款用于UI自动化测试的项目. testerhome中的文档介绍:https://testerhome.com/topics/12486 官方链 ...