shell脚本实例-shell 分析系统瓶颈脚本
作者简介:
陈志珂(头条号:强扭的瓜不好吃)目前就职于中国最大的安卓应用软件公司,任高级工程师,现在公司任php开发工程师,python开发工程师,高级运维工程师,公众号“铅笔学园”运维内容合作作者之一。**
铅笔学园:IT资源分享|知识分享,做初级程序员的指明灯**
shell脚本实例-shell 分析系统瓶颈脚本
#!/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” == “Red” ]; then
P_M=yum
elif [ “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 “{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 “{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”% –>”,12,14,16,”(PID:”CPU_LOG
ps aux |awk ‘{if(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”% –>”,12,14,16,”(PID:”MEM_LOG
ps aux |awk ‘{if(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 [[ ]] || [[ ]] && [[ 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 “{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