脚本功能:
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/bash
ACTION="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" ]];then
set_language
fi
help(){
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 ];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" == "ubuntu"];then
P_M=apt-get
else
echo "$OS_VERSION_INFO"
exit 1
fi
}
# 使用root登录;$LOGNAME和$USER一样
if [ $LOGNAME != root ];then
echo "$LOGIN_INFO"
exit 1
fi
#检测vmstat命令是否安装
if ! which vmstat &>/dev/null; then
echo "$VMSTAT_INFO"
sleep 1
os_check
$P_M install procps -y
fi
#检测iostat命令是否安装
which iostat &>/dev/null
if [ $? -ne 0 ];then
echo "$IOSTAT_INFO"
sleep 1
os_check
$P_M install sysstat -y
fi
#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内置函数:int
DISK_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的进程"
break
fi
echo
}
#占用内存高的前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_LOG
if [[ -n `cat $MEM_LOG` ]];then ##-n:字符串长度不是0的话
cat $MEM_LOG
>$MEM_LOG ##将文件清空
else
# echo "No process using the Memory"
echo "没有使用内存的进程"
break
fi
echo
}
#查看网络流量
traffic(){
echo -e "\n\e[32m================= $TRAFFIC =================\e[0m"
tmp_file=/tmp/.rx_tx.tmp
tmp_log=/tmp/.rx_tx.log
{
while true
do
devs=(`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 1
pid=`ps -ef|grep $0 |grep -v grep|awk 'NR==1{print $2}'`
if [[ $$ -ne $pid || -e $tmp_file ]];then
rm -rf $tmp_file
break;
fi
RX_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[@]}`
do
RX_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 ]];then
RX_array[i-1]="${RX_array[i-1]}B/s"
elif [[ ${RX_array[i-1]} -gt 1048576 ]];then
RX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')
else
RX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1024 "KB/s"}')
fi
if [[ ${TX_array[i-1]} -lt 1024 ]];then
TX_array[i-1]="${TX_array[i-1]}B/s"
elif [[ ${TX_array[i-1]} -gt 1048576 ]];then
TX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')
else
TX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1024 "KB/s"}')
fi
done
clear
echo -e "\n\e[32m================= $TRAFFIC =================\e[0m" >> $tmp_log
echo -e "`date '+%Y-%m-%d %H:%M:%S'`\n" >> $tmp_log
printf "%-15s%-15s%-15s\n" "DEV" "RX(下行)" "TX(上行)" >> $tmp_log
for i in `seq ${#RX_array_next[@]}`
do
printf "%-15s%-15s%-15s\n" ${devs[i-1]} ${RX_array[i-1]} ${TX_array[i-1]} >> $tmp_log
done
cat $tmp_log
> $tmp_log
echo -n -e "\n(q for quit): "
done
} &
while true
do
read flag
if [[ "$flag" = "q" ]];then
touch $tmp_file
break;
fi
done
}
echo "$TITLE"
while [[ true ]]; do
read -p "$ACTION" command
case "$command" in
m )
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
;;
esac
done