#!/usr/bin/bash

PS3="Your choice is: [10 for quit]"

#检查是那个系统

os_check() {

if [ -e /etc/redhat-release ]; then

REDHAT=`cat /etc/redhat-release |cut -d' ' -f1`

else

DEBIAN=`cat /etc/issue |cut -d' ' -f1`

fi

if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then

P_M=yum

elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then

P_M=apt-get

else

Operating system does not support.

exit 1

fi

}

#判断是否是root用哦过户

if [ $LOGNAME != root ]; then

echo "Please use the root account operation."

exit 1

fi

#查看cpu工具是否安装

if ! which vmstat &>/dev/null; then

echo "vmstat command not found, now the install."

sleep 1

os_check

$P_M install procps -y

echo "-----------------------------------------------------------------------"

fi

#查看磁盘使用率的工具是否安装

if ! which iostat &>/dev/null; then

echo "iostat command not found, now the install."

sleep 1

os_check

$P_M install sysstat -y

echo "-----------------------------------------------------------------------"

fi

while true; do

select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit; do

case $input in

cpu_load)

#CPU usage and load

echo "---------------------------------------"

i=1

while [[ $i -le 3 ]]; do

echo -e "[32m Reference value${i}[0m"

UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`

USER=`vmstat |awk '{if(NR==3)print $13"%"}'`

SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`

IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`

echo "Util: $UTIL"

echo "User use: $USER"

echo "System use: $SYS"

echo "I/O wait: $IOWAIT"

i=$(($i+1))

sleep 1

done

echo "---------------------------------------"

break

;;

disk_load)

#硬盘I/O负载

echo "---------------------------------------"

i=1

while [[ $i -le 3 ]]; do

echo -e "[32m Reference value${i}[0m"

UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`

READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`

WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`

IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`

echo -e "Util:"

echo -e "${UTIL}"

echo -e "I/O Wait: $IOWAIT"

echo -e "Read/s: $READ"

echo -e "Write/s: $WRITE"

i=$(($i+1))

sleep 1

done

echo "---------------------------------------"

break

;;

disk_use)

#硬盘利用率

DISK_LOG=/tmp/disk_use.tmp

DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&//dev/{printf $2" ";printf "%d",$3;print "GB"}'`

USE_RATE=`df -h |awk '/^/dev/{print int($5)}'`

for i in $USE_RATE; do

if [ $i -gt 90 ];then

PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`

echo "$PART = ${i}%" >> $DISK_LOG

fi

done

echo "---------------------------------------"

echo -e "Disk total: ${DISK_TOTAL}"

if [ -f $DISK_LOG ]; then

echo "---------------------------------------"

cat $DISK_LOG

echo "---------------------------------------"

rm -f $DISK_LOG

else

echo "---------------------------------------"

echo "Disk use rate no than 90% of the partition."

echo "---------------------------------------"

fi

break

;;

disk_inode)

#disk inode useage

INODE_LOG=/tmp/inode_use.tmp

INODE_USE=`df -i |awk '/^/dev/{print int($5)}'`

for i in $INODE_USE; do

if [ $i -gt 90 ]; then

PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`

echo "$PART = ${i}%" >> $INODE_LOG

fi

done

if [ -f $INODE_LOG ]; then

echo "---------------------------------------"

rm -f $INODE_LOG

else

echo "---------------------------------------"

echo "Inode use rate no than 90% of the partition."

echo "---------------------------------------"

fi

break

;;

mem_use)

#memory useage

echo "---------------------------------------"

MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`

USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`

FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`

CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`

echo -e "Total: $MEM_TOTAL"

echo -e "Use: $USE"

echo -e "Free: $FREE"

echo -e "Cache: $CACHE"

echo "---------------------------------------"

break

;;

tcp_status)

#tcp connection status

echo "---------------------------------------"

COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`

echo -e "TCP connection status: $COUNT"

echo "---------------------------------------"

;;

cpu_top10)

# top 10 of cpu processes

echo "---------------------------------------"

CPU_LOG=/tmp/cpu_top.tmp

i=1

while [[ $i -le 3 ]]; do

#ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG

ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i" ";else printf $i}}' |sort -k4 -nr |head -10 > $CPU_LOG

#循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列

if [[ -n `cat $CPU_LOG` ]]; then

echo -e "[32m Reference value${i}[0m"

cat $CPU_LOG

> $CPU_LOG

else

echo "No process using the CPU."

break

fi

i=$(($i+1))

sleep 1

done

echo "---------------------------------------"

break

;;

mem_top10)

#top of memory processes

echo "---------------------------------------"

MEM_LOG=/tmp/mem_top.tmp

i=1

while [[ $i -le 3 ]]; do

#ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG

ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i" ";else printf $i}}' |sort -k4 -nr |head -10 > $MEM_LOG

if [[ -n `cat $MEM_LOG` ]]; then

echo -e "[32m Reference value${i}[0m"

cat $MEM_LOG

> $MEM_LOG

else

echo "No process using the Memory."

break

fi

i=$(($i+1))

sleep 1

done

echo "---------------------------------------"

break

;;

traffic)

# check network

while true; do

read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth

#if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "<$eth>"` -eq 1 ]]; then

if [ `ifconfig |grep -c "<$eth>"` -eq 1 ]; then

break

else

echo "Input format error or Don't have the card name, please input again."

fi

done

echo "---------------------------------------"

echo -e " In ------ Out"

i=1

while [[ $i -le 3 ]]; do

#OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`

#OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`

OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`

#CentOS6和CentOS7 ifconfig输出进出流量信息位置不同,CentOS6中RX与TX行号等于8,CentOS7中RX行号是5,TX行号是5,所以就做了个判断.

OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`

sleep 1

NEW_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`

NEW_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`

IN=`awk 'BEGIN{printf "%.1f ",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`

OUT=`awk 'BEGIN{printf "%.1f ",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`

echo "${IN}MB/s ${OUT}MB/s"

i=$(($i+1))

sleep 1

done

echo "---------------------------------------"

break

;;

quit)

exit 0

;;

*)

echo "---------------------------------------"

echo "Please enter the number."

echo "---------------------------------------"

break

;;

esac

done

done

作者简介: 
陈志珂(头条号:强扭的瓜不好吃)目前就职于中国最大的安卓应用软件公司,任高级工程师现在公司任php开发工程师,python开发工程师,高级运维工程师,公众号“铅笔学园”运维内容合作作者之一。
铅笔学园:IT资源分享|知识分享,做初级程序员的指明灯

shell脚本实例-shell 分析系统瓶颈脚本的更多相关文章

  1. 分享7个shell脚本实例--shell脚本练习必备

    概述 看多shell脚本实例自然就会有shell脚本的编写思路了,所以我一般比较推荐看脚本实例来练习shell脚本.下面分享几个shell脚本实例. 1.监测Nginx访问日志502情况,并做相应动作 ...

  2. shell实现增加删除Linux系统用户脚本(密码为随机)

    README shell环境下运行脚本,根据需求选择相应的功能. List \t\t create the userlist 这一步是必须执行的,脚本会识别本地当前目录下的文件 Useradd \t\ ...

  3. Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈

    导读 微服务架构中,是否遇到过这种情况,服务间调用链过长,导致性能迟迟上不去,不知道哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶 ...

  4. Shell实现多级菜单系统安装维护脚本实例分享

    Shell实现多级菜单系统安装维护脚本实例分享 这篇文章主要介绍了Shell实现多级菜单系统安装维护脚本实例分享,本文脚本用多级菜单实现管理WEB服务器.Mysql服务器.Nginx服器等,需要的朋友 ...

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

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

  6. shell脚本异步日志分析-接口耗时、可用率

    背景:现有日志接入日志报表大盘,为了避免作业高峰期间(双十一),系统也要观测系统整体情况,因此提出了观测近五分钟,接口成功率以及耗时等工具(默认统计最近五分钟,并进行结果汇总统计) 使用说明 前提:p ...

  7. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  8. Liu Junqiao:生产环境中shell脚本实例

    在生产环境中,我们时常要注意主机的各种硬件状态,如果是规模较大的服务集群zabbix等健康工具当然好用,如果只是一些小规模的服务主机,shell就会表现的更灵活,也更适用,今天就和大家分享一个系统巡检 ...

  9. SHELL脚本自动备份Linux系统

    今天来写一个使用shell脚本增量备份系统文件,顺便复习一下shell脚本相关的命令,这个脚本可以根据自己的需求来备份不同的文件或者文件夹,进行完整备份和增量备份.直接上脚本如下: #!/bin/sh ...

随机推荐

  1. lanmp中环境变量的更改方法

    1.vim /etc/profile 改成: export PATH=$PATH:/www/wdlinux/phps/71/bin/ 然后运行: source /etc/profile

  2. Routing a Marathon Race

    直接爆搜的复杂度是2^n,对于n<=40的数据过不了. 考虑优化一下. 发现如果走了一个点后,以后是不可能再经过与它相邻的点的,因为这样走显然不如直接走那个与它相邻的点. 这样每走一步就可以删掉 ...

  3. CentOS7 添加开机启动项

     centos6 加入开机启动:   vim /etc/rc.d/rc.local 注意命令不要出错,重启后生效   或者   centos 7 下: vim /lib/systemd/system/ ...

  4. wordpress +window 走起~

    一.安装XAMPP   1 百度搜索xampp后下载安装到D盘(安装时按默认勾选安装即可) 2 安装完后,点击Start来启动Apache和MySQL这两个服务 3 如果Apache服务不能启动,多数 ...

  5. Linux中man手册的使用

    Linux中man手册的使用 ——以CentOS6.8为例 本文旨在介绍在Linux中如何快速入手新命令,毕竟在Linux系统中,可以通过命令完成一切操作. 相关命令:help man whatis ...

  6. git回退代码到某次commit

    回退命令: $ git reset --hard HEAD^ 回退到上个版本 $ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前 $ git res ...

  7. js 异步加载

    document 加载 document.write("<scr" + "ipt src=\"js/jquery.js\"></sc ...

  8. 函数使用六:ABAP4_CALL_TRANSACTION

    此函数是在程序中调用一个事物代码,跳转或者执行事物代码的程序. 参数说明: Import TCODE                            执行的事物代码 SKIP_SCREEN   ...

  9. Beta阶段——第6篇 Scrum 冲刺博客

    Beta阶段--第6篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了函数的编写,提供报表数 ...

  10. python中Flask模块的使用

    1.简介 在服务器上运行Flask接口,就能使用requests模块获取该接口的值. 先运行接口文件,再运行requests文件,即可获取值. 2.示例 2.1一个简单的flask接口 import ...