需求描述:
编写shell脚本收集系统信息
实现代码:
#!/bin/bash
# 版本:v1.0
# 收集系统信息 by ytchen5
LANG=en
PS3="You choice is: "
oscheck(){
if [ -z /etc/redhat-release ];then
REDHAT=`cat /etc/redhat-release | cut -d" " -f1`
else
DEBAIN=`cat /etc/issue | grep -E -v "^$"| cut -d" " -f1`
fi
if [ ${REDHAT:=abc} == "CentOS" -o ${REDHAT:=abc} == "Red" ];then
P_M="yum"
elif [ ${DEBAIN:=abc} == "Ubuntu" -o ${DEBAIN:=abc} == "ubuntu" ];then
P_M="apt-get"
else
echo "Operating system does not support."
exit 1
fi
if [ $LOGNAME != "root" ];then
echo "please use the root account operation."
exit 1
fi
}
tools_check(){
if ! which vmstat &>/dev/null;then
echo "vmstat command not found,new the install."
sleep 1
oscheck
$P_M install vmstat*
fi
if ! which iostat &>/dev/null;then
echo "iostat command not found,new the install."
sleep 1
oscheck
$P_M install sysstat
fi
}
# 收集CPU利用率与负载情况
cpu_load(){
UTIL=`vmstat | awk '{if(NR==3){print 100 - $15"%"}}'`
USER=`vmstat | awk '{if(NR==3){print $13"%"}}'`
SYSTEM=`vmstat | awk '{if(NR==3){print $14"%"}}'`
IOWAIT=`vmstat | awk '{if(NR==3){print $16"%"}}'`
echo "UTIL: $UTIL"
echo "USER: $USER"
echo "SYSTEM: $SYSTEM"
echo "IOWAIT: $IOWAIT"
}
# 收集硬盘利用率及负载情况
disk_load(){
UTIL=`iostat -x -k | awk -F"[ \t]+" 'BEGIN{OFS=": "}/^sd[a-z]+/{print $1,$NF"%"}'`
READ=`iostat -x -k | awk -F"[ \t]+" 'BEGIN{OFS=": "}/^sd[a-z]+/{print $1,$3"KB"}'`
WRITE=`iostat -x -k | awk -F"[ \t]+" 'BEGIN{OFS=": "}/^sd[a-z]+/{print $1,$9"KB"}'`
IOWAIT=`vmstat | awk '{if(NR==3){print $16"%"}}'`
echo -e "%util: \n$UTIL"
echo -e "rkB/s: \n$READ"
echo -e "wkB/s: \n$WRITE"
echo -e "%iowait: \n$IOWAIT"
}
# 收集硬盘的利用率
disk_use(){
disk_tatle=(`fdisk -l | awk -F"[ :,]" 'BEGIN{ORS=" ";OFS="="}/Disk.*\/dev\/sd[a-z]/{print $2,$4"G"}'`)
echo -e "\033[32m磁盘容量:\033[0m"
for a in ${!disk_tatle[*]}
do
echo ${disk_tatle[a]}
done
echo -e "\033[32m当前使用:\033[0m"
for j in ${!disk_tatle[*]}
do
sum=0
sub_disk=`echo ${disk_tatle[j]} | awk -F"=" '{print $1}'`
sub_disk_size=`echo ${disk_tatle[j]} | awk -F"=" '{print $2}'`
argv=(`df -Th | awk -F"[ ]"+ 'BEGIN{ORS=" "}{if($1 ~ "'"$sub_disk"'"){print $4}}'`)
for i in ${!argv[*]}; do
if [[ ${argv[i]} =~ [0-9]+G$ ]]; then
sum=$(($sum + `echo ${argv[i]}| awk '{print int($1)}'`))
elif [[ ${argv[i]} =~ [0-9]+M$ ]]; then
sum=$(($sum + `echo ${argv[i]}| awk '{print int($1)}'`/1024))
elif [[ ${argv[i]} =~ [0-9]+K$ ]]; then
sum=$(($sum + `echo ${argv[i]}| awk '{print int($1)}'`/1024/1024))
else
:
fi
done
echo $sub_disk: $sum"G"
done
echo -e "\033[32m磁盘剩余:\033[0m"
sazi=`echo $sub_disk_size| awk '{print int($0)}'`
echo $sub_disk:$(($sazi-$sum))G
}
# 统计磁盘inode利用率
disk_inode(){
inode_argv=(`df -i | awk -F"[ ]+" 'BEGIN{OFS="="}/^\/dev\/sd[a-z][0-9]/{print $1,int($5)}'`)
#inode_argv=(`df -i | awk -F"[ ]+" 'BEGIN{OFS="="}/^\/dev\//{print $1,int($5)}'`)
for i in ${!inode_argv[*]}
do
if [[ ${inode_argv[i]#*=} -gt 80 ]]; then
echo -e "\033[31m警告:如下磁盘inode资源不足!\033[0m"
echo "${inode_argv[i]%=*} : ${inode_argv[i]#*=}%"
else
echo "${inode_argv[i]%=*} : ${inode_argv[i]#*=}%"
fi
done
}
# 收集内存的使用情况
mem_use(){
mem_total=`free -m | awk -F"[ ]+" '/Mem/{printf "%0.3fG\n",$2/1024}'`
mem_use=`free -m | awk -F"[ ]+" '/Mem/{printf "%0.3fG\n",$3/1024}'`
mem_free=`free -m | awk -F"[ ]+" '/Mem/{printf "%0.3fG\n",$4/1024}'`
mem_cache=`free -m | awk -F"[ ]+" '/Mem/{printf "%0.3fG\n",$6/1024}'`
echo "内存总量: $mem_total"
echo "内存使用: $mem_use"
echo "内存剩余: $mem_free"
echo "缓存容量: $mem_cache"
}
# 收集TCP使用状态
tcp_status(){
ss -ant | awk -F"[ ]+" '!/State/{type[$1]++}END{for(i in type) print i,type[i]}'
}
cpu_top10(){
# 显示长格式的
ps aux | awk '{if($3>0.1){{printf "PID "$2" CPU "$3"%%----> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' | sort -t" " -k4 -rn | head -10
# 显示短格式的
#ps aux | awk '{if($3>0.1){print "PID "$2" CPU "$3"%%----> "$11}}' | sort -t" " -k4 -rn | head -10
}
mem_top10(){
# 长格式显示
#ps aux | awk -F"[ ]+" '{if($4>0.1){{printf "PID: "$2" memory: "$4"%%--->"}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}'| sort -brn -t":" -k3 | head -10
# sort
# -b 忽略分段开头的空格
# -r 已降序排列
# -n 按照数值大小排序
# -t":" 指定字段分割符号 为:
# -k3 指定按照第3个字段排序
# 短格式显示
ps aux | awk -F"[ ]+" '{if($4>0.1){print "PID: "$2" memory: "$4"%%--->"$11}}'| sort -brn -t":" -k3 | head -10
}
traffic(){
eth_list=`ifconfig | grep -E "^$" -A1 | awk -F":" 'BEGIN{ORS=" "}/[^^$|--]/{print $1}'`
#read -p "please enter the network card name($eth_list):" eth
select eth in $eth_list;do
if [[ `ifconfig | grep -E -c "\<$eth\>"` -eq 1 ]]; then
# 接收的网络流量
begin_RXtraffic=`ifconfig $eth | awk -F"[ ]+" '/RX.*bytes/{print $6}'`
sleep 1
end_RXtraffic=`ifconfig $eth | awk -F"[ ]+" '/RX.*bytes/{print $6}'`
RX=`awk 'BEGIN{printf "%0.1f\n",'$(($end_RXtraffic - $begin_RXtraffic))'/1024/128}'`
echo -e "Received traffic: \033[32m${RX}MB/s\033[0m"
# 发送的网络流量
begin_TXtraffic=`ifconfig $eth | awk -F"[ ]+" '/TX.*bytes/{print $6}'`
sleep 1
end_TXtraffic=`ifconfig $eth | awk -F"[ ]+" '/TX.*bytes/{print $6}'`
TX=`awk 'BEGIN{printf "%0.1f\n",'$(($end_TXtraffic - $begin_TXtraffic))'/1024/128}'`
echo -e "Sending traffic: \033[32m${TX}MB/s\033[0m"
break
else
echo "No network card found, please select again"
fi
done
}
main(){
oscheck
tools_check
while true
do
select vir in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit;do
case $vir in
cpu_load)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32m\tCPU负载:参考数值$i:\033[0m"
cpu_load
sleep 1
done
echo "################################"
break
;;
disk_load)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32m硬盘负载:参考数值$i:\033[0m"
disk_load
sleep 1
done
echo "################################"
break
;;
disk_use)
clear
echo "################################"
disk_use
echo "################################"
break
;;
disk_inode)
clear
echo "################################"
echo -e "\033[32m硬盘INODE:参考数值:\033[0m"
disk_inode
echo "################################"
break
;;
mem_use)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32m内存使用情况:参考数值$i:\033[0m"
mem_use
sleep 1
done
echo "################################"
break
;;
tcp_status)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32mTCP连接状态:参考数值$i:\033[0m"
tcp_status
sleep 1
done
echo "################################"
break
;;
cpu_top10)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32mCPU_TOP10:参考数值$i:\033[0m"
cpu_top10
sleep 1
done
echo "################################"
break
;;
mem_top10)
clear
echo "################################"
for (( i = 1; i <= 3; i++ )); do
echo -e "\033[32m内存_TOP10:参考数值$i:\033[0m"
mem_top10
sleep 1
done
echo "################################"
break
;;
traffic)
clear
echo "################################"
traffic
echo "################################"
break
;;
quit)
exit
esac
done
done
}
main
验证结果:
################################
CPU负载:参考数值1:
UTIL: 12%
USER: 10%
SYSTEM: 3%
IOWAIT: 0%
CPU负载:参考数值2:
UTIL: 12%
USER: 10%
SYSTEM: 3%
IOWAIT: 0%
CPU负载:参考数值3:
UTIL: 12%
USER: 10%
SYSTEM: 3%
IOWAIT: 0%
################################
硬盘负载:参考数值1:
%util:
sda: 0.78%
sdb: 0.36%
rkB/s:
sda: 37.58KB
sdb: 113.35KB
wkB/s:
sda: 3.62KB
sdb: 58.79KB
%iowait:
0%
硬盘负载:参考数值2:
%util:
sda: 0.78%
sdb: 0.36%
rkB/s:
sda: 37.58KB
sdb: 113.34KB
wkB/s:
sda: 3.62KB
sdb: 58.79KB
%iowait:
0%
硬盘负载:参考数值3:
%util:
sda: 0.78%
sdb: 0.36%
rkB/s:
sda: 37.58KB
sdb: 113.33KB
wkB/s:
sda: 3.62KB
sdb: 58.78KB
%iowait:
0%
################################
################################
磁盘容量:
/dev/sda=465.78G
/dev/sdb=111.81G
当前使用:
/dev/sda: 9G
/dev/sdb: 14G
磁盘剩余:
/dev/sdb:97G
################################
硬盘INODE:参考数值:
/dev/sdb5 : 4%
/dev/sdb1 : 0%
/dev/sda1 : 1%
################################
内存使用情况:参考数值1:
内存总量: 15.368G
内存使用: 2.565G
内存剩余: 10.452G
缓存容量: 2.350G
内存使用情况:参考数值2:
内存总量: 15.368G
内存使用: 2.565G
内存剩余: 10.448G
缓存容量: 2.354G
内存使用情况:参考数值3:
内存总量: 15.368G
内存使用: 2.564G
内存剩余: 10.447G
缓存容量: 2.354G
################################
TCP连接状态:参考数值1:
ESTAB 17
LISTEN 12
TIME-WAIT 1
TCP连接状态:参考数值2:
ESTAB 17
LISTEN 12
TIME-WAIT 1
TCP连接状态:参考数值3:
ESTAB 14
LISTEN 12
TIME-WAIT 4
################################
CPU_TOP10:参考数值1:
PID 10438 CPU 27.2%----> /usr/lib/firefox/firefox-new-window
PID 10641 CPU 20.3%----> /usr/lib/firefox/firefox-contentproc-childID4-isForBrowser-prefsLen7335-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 4018 CPU 4.0%----> /usr/bin/gnome-shell
PID 3859 CPU 3.6%----> /usr/lib/xorg/Xorgvt2-displayfd3-auth/run/user/1000/gdm/Xauthority-backgroundnone-noreset-keeptty-verbose3
PID 10689 CPU 3.2%----> /usr/lib/firefox/firefox-contentproc-childID5-isForBrowser-prefsLen7401-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 5990 CPU 2.2%----> /snap/sublime-text/97/opt/sublime_text/sublime_text
PID 10614 CPU 1.9%----> /usr/lib/firefox/firefox-contentproc-childID3-isForBrowser-prefsLen7181-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10512 CPU 1.1%----> /usr/lib/firefox/firefox-contentproc-childID1-isForBrowser-prefsLen1-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10761 CPU 1.0%----> /usr/lib/firefox/firefox-contentproc-childID6-isForBrowser-prefsLen7448-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 43 CPU 0.5%----> [ksmd]
CPU_TOP10:参考数值2:
PID 10438 CPU 27.1%----> /usr/lib/firefox/firefox-new-window
PID 10641 CPU 20.3%----> /usr/lib/firefox/firefox-contentproc-childID4-isForBrowser-prefsLen7335-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 4018 CPU 4.0%----> /usr/bin/gnome-shell
PID 3859 CPU 3.6%----> /usr/lib/xorg/Xorgvt2-displayfd3-auth/run/user/1000/gdm/Xauthority-backgroundnone-noreset-keeptty-verbose3
PID 10689 CPU 3.2%----> /usr/lib/firefox/firefox-contentproc-childID5-isForBrowser-prefsLen7401-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 5990 CPU 2.2%----> /snap/sublime-text/97/opt/sublime_text/sublime_text
PID 10614 CPU 1.9%----> /usr/lib/firefox/firefox-contentproc-childID3-isForBrowser-prefsLen7181-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10512 CPU 1.1%----> /usr/lib/firefox/firefox-contentproc-childID1-isForBrowser-prefsLen1-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10761 CPU 1.0%----> /usr/lib/firefox/firefox-contentproc-childID6-isForBrowser-prefsLen7448-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 43 CPU 0.5%----> [ksmd]
CPU_TOP10:参考数值3:
PID 10438 CPU 27.0%----> /usr/lib/firefox/firefox-new-window
PID 10641 CPU 20.3%----> /usr/lib/firefox/firefox-contentproc-childID4-isForBrowser-prefsLen7335-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 4018 CPU 4.0%----> /usr/bin/gnome-shell
PID 3859 CPU 3.6%----> /usr/lib/xorg/Xorgvt2-displayfd3-auth/run/user/1000/gdm/Xauthority-backgroundnone-noreset-keeptty-verbose3
PID 10689 CPU 3.2%----> /usr/lib/firefox/firefox-contentproc-childID5-isForBrowser-prefsLen7401-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 5990 CPU 2.2%----> /snap/sublime-text/97/opt/sublime_text/sublime_text
PID 10614 CPU 1.9%----> /usr/lib/firefox/firefox-contentproc-childID3-isForBrowser-prefsLen7181-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10512 CPU 1.1%----> /usr/lib/firefox/firefox-contentproc-childID1-isForBrowser-prefsLen1-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 10761 CPU 1.0%----> /usr/lib/firefox/firefox-contentproc-childID6-isForBrowser-prefsLen7448-prefMapSize229608-parentBuildID20201211215739-appdir/usr/lib/firefox/browser10438truetab
PID 43 CPU 0.5%----> [ksmd]
################################
1) lo
2) virbr0
3) virbr1
4) vnet0
5) vnet1
6) vnet2
7) wlp3s0
You choice is: 7
Received traffic: 39.0MB/s
Sending traffic: 0.3MB/s
################################