脚本功能:
1.查看CPU利用率与负载(top,vmstat,sar)
2.查看磁盘,inode利用率与I/O负载(df, iostate,iotop,sar,dstat)
3.查看内存利用率(free,vmstat)
4.查看TCP连接状态(netstat,ss)
5.查看CPU与内存占用最高的10个进程(top,ps)
6.查看网络流量(ifconfig,iftop,iptraf)vim sysInfo.sh
#!/usr/bin/bashACTION="command(m for help):"TITLE="system monitor:"COMMAND_ACTION="Command action:"CPU_LOAD="Look at CPU utilization versus load"DISK_LOAD="Look at the hard disk I/0 load"DISK_USE="Check hard disk capacity and utilization"DISK_INODE="Check the disk inode utilization"MEM_USE="Check memory usage"TCP_STATUS="View network connection status and network listening port"CPU_TOP_10="CPU usage is high in the top 10 processes"MEM_TOP_10="Top 10 processes with high memory"TRAFFIC="View the network traffic"HELP="Help"EXIT="Exit"OS_VERSION_INFO="OS not support"LOGIN_INFO="Please use root account"VMSTAT_INFO="vmstat command not fount,now install"IOSTAT_INFO="iostat command not fount,now install"set_language(){ACTION="命令(输入 m 获取帮助):"TITLE="系统监控:"COMMAND_ACTION="操作命令:"CPU_LOAD="查看CPU利用率与负载"DISK_LOAD="查看硬盘I/0负载"DISK_USE="查看硬盘容量以及利用率"DISK_INODE="查看硬盘inode利用率"MEM_USE="查看内存使用情况"TCP_STATUS="查看网络连接状态以及网络监听端口"CPU_TOP_10="查看用占CPU高的前10个进程"MEM_TOP_10="查看占用内存高的前10个进程"TRAFFIC="查看网络流量"HELP="查看帮助手册"EXIT="退出"OS_VERSION_INFO="系统版本不支持"LOGIN_INFO="请使用root用户登录"VMSTAT_INFO="vmstat 命令没有发现,现在开始安装"IOSTAT_INFO="iostat 命令没有发现,现在开始安装"}if [[ "$LANG" = "zh_CN.UTF-8" ]];thenset_languagefihelp(){echo -e "\n\t$COMMAND_ACTION"echo -e "\t 1 $DISK_LOAD"echo -e "\t 2 $DISK_LOAD"echo -e "\t 3 $DISK_USE"echo -e "\t 4 $DISK_INODE"echo -e "\t 5 $MEM_USE"echo -e "\t 6 $TCP_STATUS"echo -e "\t 7 $CPU_TOP_10"echo -e "\t 8 $MEM_TOP_10"echo -e "\t 9 $TRAFFIC"echo -e "\t m $HELP"echo -e "\t q $EXIT\n"}#系统版本检测os_check(){if [ -e /etc/redhat-release ];thenREDHAT=`cat /etc/redhat-release| cut -d' ' -f1`elseDEBIAN=`cat /etc/issue|cut -d' ' -f1`fiif [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ];thenP_M=yumelif [ "$DEBIAN" == "Ubuntu" -o "DEBIAN" == "ubuntu"];thenP_M=apt-getelseecho "$OS_VERSION_INFO"exit 1fi}# 使用root登录;$LOGNAME和$USER一样if [ $LOGNAME != root ];thenecho "$LOGIN_INFO"exit 1fi#检测vmstat命令是否安装if ! which vmstat &>/dev/null; thenecho "$VMSTAT_INFO"sleep 1os_check$P_M install procps -yfi#检测iostat命令是否安装which iostat &>/dev/nullif [ $? -ne 0 ];thenecho "$IOSTAT_INFO"sleep 1os_check$P_M install sysstat -yfi#CPU利用率与负载cpu_load(){echo -e "\n\e[32m================= $CPU_LOAD =================\e[0m"UTIL=`vmstat | awk '{if(NR==3) print 100-$15"%"}'` ##100-idle空闲的,NR==3处理第3行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 "Utile(使用率): $UTIL"echo "User use(用户使用率):$USER"echo "System use(系统使用率): $SYS"echo "I/O wait(I/O等待): $IOWAIT"echo}#硬盘I/O负载disk_load(){echo -e "\n\e[32m================= $DISK_LOAD =================\e[0m"UTIL=`iostat -x -k | awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'` ##OFS=": "表示以:或者空格分割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 "I/O wait: $IOWAIT"echo -e "I/O Wait: $IOWAIT"echo -e "Read/s: \n$READ"echo -e "Write/s: \n$WRITE"echo}#硬盘利用率disk_use(){echo -e "\n\e[32m================= $DISK_USE =================\e[0m"DISK_TOTAL=`fdisk -l |awk '/^(Disk|磁盘).*(bytes|字节)/ && /\/dev/{printf $2" ";print $3}'`USE_RATE=`df -h | awk '/^\/dev/{print int($5)}'` ##awk内置函数:intDISK_USED=`printf "%-34s%-12s%-12s%-18s%-10s\n" "文件系统" "已用" "总共" "使用率" "挂载点" && df -h | awk '/^\/dev/{printf "%-30s%-10s%-10s%-15s%-10s\n",$1,$3,$2,$5,$6}'`echo "--------------------------"echo -e "Disk toltal:\n${DISK_TOTAL}"echo "--------------------------"echo -e "Disk used:\n${DISK_USED}"echo "--------------------------"echo}#硬盘inode利用率disk_inode(){echo -e "\n\e[32m================= $DISK_INODE =================\e[0m"INODE_USE=`printf "%-34s%-12s%-12s%-18s%-10s\n" "文件系统" "已用" "总共" "使用率" "挂载点" && df -i | awk '/^\/dev/{printf "%-30s%-10s%-10s%-15s%-10s\n",$1,$3,$2,$5,$6}'`echo "--------------------------"echo -e "inode use:\n${INODE_USE}"echo "--------------------------"echo}#内存利用率mem_use(){echo -e "\n\e[32m================= $MEM_USE =================\e[0m"MEM_TOTAL=`free -m|awk '{if(NR==2)printf "%.1f" ,$2/1024} END{print "G"}'` ##%.1保留小数点1位,f是浮点型USE=`free -m|awk '{if(NR==2)printf "%.1f" ,$3/1024} END{print "G"}'`FREE=`free -m|awk '{if(NR==2)printf "%.1f" ,$4/1024} END{print "G"}'`echo -e "Total: $MEM_TOTAL"echo -e "Use:$USE"echo -e "Free : $FREE"echo}##网络连接状态tcp_status(){echo -e "\n\e[32m================= $TCP_STATUS =================\e[0m"COUNT=`ss -ant|awk '!/State/{status[$1]++}END{for(i in status) print i,status[i]}'`LISTEN=`netstat -antp | awk '/(LISTEN)|(State)/{if( NR == 2) {printf "%-30s%20s%15s %-20s\n", $1,$4,$8,$9} else {printf "%-30s%20s%15s %-20s\n", $1,$4,$6,$7}}'`echo "--------------------------"echo -e "TCP connection status:\n$COUNT"echo "--------------------------"echo -e "LISTEN:\n${LISTEN}"echo "--------------------------"echo}#占用CPU高的前10个进程cpu_top10(){echo -e "\n\e[32m================= $CPU_TOP_10 =================\e[0m"CPU_LOG=/tmp/cpu_top.tmp##printf不带换行符,print会有换行符##sort -k2按照第2列排序 -nr表示逆序ps aux|awk '{if(($3>0)){{printf "PID: "$2" CPU: "$3"%% ---> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i" "}}'|sort -k4 -nr|head -10 >$CPU_LOG##循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列##if((i==NF))printf $i"\n";else printf $i也可以写成:if((i==NF))printf{$i"\n"};else {printf $i'if [[ -n `cat $CPU_LOG` ]];then ##-n:字符串长度不是0的话#echo -e "\033[32m 参考值${i}\033[0m"cat $CPU_LOG>$CPU_LOG ##将文件清空else# echo "No process using the CPU"echo "没有使用cpu的进程"breakfiecho}#占用内存高的前10个进程mem_top10(){echo -e "\n\e[32m================= $MEM_TOP_10 =================\e[0m"MEM_LOG=/tmp/mem_top.tmp##printf不带换行符,print会有换行符##sort -k2按照第2列排序 -nr表示逆序ps aux|awk '{if(($4>0)){{printf "PID: "$2" MEM: "$4"%% ---> "}for(i=11;i<=NF;i++)if((i==NF))printf $i"\n" ;else printf $i" "}}'|sort -k4 -nr|head -10 >$MEM_LOGif [[ -n `cat $MEM_LOG` ]];then ##-n:字符串长度不是0的话cat $MEM_LOG>$MEM_LOG ##将文件清空else# echo "No process using the Memory"echo "没有使用内存的进程"breakfiecho}#查看网络流量traffic(){echo -e "\n\e[32m================= $TRAFFIC =================\e[0m"tmp_file=/tmp/.rx_tx.tmptmp_log=/tmp/.rx_tx.log{while truedodevs=(`cat /proc/net/dev | sed -n '/:/p' | sed 's/:/ /g' | awk '{print $1}'`)RX_array_pre=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $2}'`)TX_array_pre=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $10}'`)sleep 1pid=`ps -ef|grep $0 |grep -v grep|awk 'NR==1{print $2}'`if [[ $$ -ne $pid || -e $tmp_file ]];thenrm -rf $tmp_filebreak;fiRX_array_next=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $2}'`)TX_array_next=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $10}'`)for i in `seq ${#RX_array_next[@]}`doRX_array[i-1]=$((${RX_array_next[i-1]}-${RX_array_pre[i-1]}))TX_array[i-1]=$((${TX_array_next[i-1]}-${TX_array_pre[i-1]}))if [[ ${RX_array[i-1]} -lt 1024 ]];thenRX_array[i-1]="${RX_array[i-1]}B/s"elif [[ ${RX_array[i-1]} -gt 1048576 ]];thenRX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')elseRX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1024 "KB/s"}')fiif [[ ${TX_array[i-1]} -lt 1024 ]];thenTX_array[i-1]="${TX_array[i-1]}B/s"elif [[ ${TX_array[i-1]} -gt 1048576 ]];thenTX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')elseTX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1024 "KB/s"}')fidoneclearecho -e "\n\e[32m================= $TRAFFIC =================\e[0m" >> $tmp_logecho -e "`date '+%Y-%m-%d %H:%M:%S'`\n" >> $tmp_logprintf "%-15s%-15s%-15s\n" "DEV" "RX(下行)" "TX(上行)" >> $tmp_logfor i in `seq ${#RX_array_next[@]}`doprintf "%-15s%-15s%-15s\n" ${devs[i-1]} ${RX_array[i-1]} ${TX_array[i-1]} >> $tmp_logdonecat $tmp_log> $tmp_logecho -n -e "\n(q for quit): "done} &while truedoread flagif [[ "$flag" = "q" ]];thentouch $tmp_filebreak;fidone}echo "$TITLE"while [[ true ]]; doread -p "$ACTION" commandcase "$command" inm )help;;q )exit 0;;1 )cpu_load;;2 )disk_load;;3 )disk_use;;4 )disk_inode;;5 )mem_use;;6 )tcp_status;;7 )cpu_top10;;8 )mem_top10;;9 )traffic;;* )help;;esacdone
