脚本功能:
    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

    1. #!/usr/bin/bash
    2. ACTION="command(m for help):"
    3. TITLE="system monitor:"
    4. COMMAND_ACTION="Command action:"
    5. CPU_LOAD="Look at CPU utilization versus load"
    6. DISK_LOAD="Look at the hard disk I/0 load"
    7. DISK_USE="Check hard disk capacity and utilization"
    8. DISK_INODE="Check the disk inode utilization"
    9. MEM_USE="Check memory usage"
    10. TCP_STATUS="View network connection status and network listening port"
    11. CPU_TOP_10="CPU usage is high in the top 10 processes"
    12. MEM_TOP_10="Top 10 processes with high memory"
    13. TRAFFIC="View the network traffic"
    14. HELP="Help"
    15. EXIT="Exit"
    16. OS_VERSION_INFO="OS not support"
    17. LOGIN_INFO="Please use root account"
    18. VMSTAT_INFO="vmstat command not fount,now install"
    19. IOSTAT_INFO="iostat command not fount,now install"
    20. set_language(){
    21. ACTION="命令(输入 m 获取帮助):"
    22. TITLE="系统监控:"
    23. COMMAND_ACTION="操作命令:"
    24. CPU_LOAD="查看CPU利用率与负载"
    25. DISK_LOAD="查看硬盘I/0负载"
    26. DISK_USE="查看硬盘容量以及利用率"
    27. DISK_INODE="查看硬盘inode利用率"
    28. MEM_USE="查看内存使用情况"
    29. TCP_STATUS="查看网络连接状态以及网络监听端口"
    30. CPU_TOP_10="查看用占CPU高的前10个进程"
    31. MEM_TOP_10="查看占用内存高的前10个进程"
    32. TRAFFIC="查看网络流量"
    33. HELP="查看帮助手册"
    34. EXIT="退出"
    35. OS_VERSION_INFO="系统版本不支持"
    36. LOGIN_INFO="请使用root用户登录"
    37. VMSTAT_INFO="vmstat 命令没有发现,现在开始安装"
    38. IOSTAT_INFO="iostat 命令没有发现,现在开始安装"
    39. }
    40. if [[ "$LANG" = "zh_CN.UTF-8" ]];then
    41. set_language
    42. fi
    43. help(){
    44. echo -e "\n\t$COMMAND_ACTION"
    45. echo -e "\t 1 $DISK_LOAD"
    46. echo -e "\t 2 $DISK_LOAD"
    47. echo -e "\t 3 $DISK_USE"
    48. echo -e "\t 4 $DISK_INODE"
    49. echo -e "\t 5 $MEM_USE"
    50. echo -e "\t 6 $TCP_STATUS"
    51. echo -e "\t 7 $CPU_TOP_10"
    52. echo -e "\t 8 $MEM_TOP_10"
    53. echo -e "\t 9 $TRAFFIC"
    54. echo -e "\t m $HELP"
    55. echo -e "\t q $EXIT\n"
    56. }
    57. #系统版本检测
    58. os_check(){
    59. if [ -e /etc/redhat-release ];then
    60. REDHAT=`cat /etc/redhat-release| cut -d' ' -f1`
    61. else
    62. DEBIAN=`cat /etc/issue|cut -d' ' -f1`
    63. fi
    64. if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ];then
    65. P_M=yum
    66. elif [ "$DEBIAN" == "Ubuntu" -o "DEBIAN" == "ubuntu"];then
    67. P_M=apt-get
    68. else
    69. echo "$OS_VERSION_INFO"
    70. exit 1
    71. fi
    72. }
    73. # 使用root登录;$LOGNAME和$USER一样
    74. if [ $LOGNAME != root ];then
    75. echo "$LOGIN_INFO"
    76. exit 1
    77. fi
    78. #检测vmstat命令是否安装
    79. if ! which vmstat &>/dev/null; then
    80. echo "$VMSTAT_INFO"
    81. sleep 1
    82. os_check
    83. $P_M install procps -y
    84. fi
    85. #检测iostat命令是否安装
    86. which iostat &>/dev/null
    87. if [ $? -ne 0 ];then
    88. echo "$IOSTAT_INFO"
    89. sleep 1
    90. os_check
    91. $P_M install sysstat -y
    92. fi
    93. #CPU利用率与负载
    94. cpu_load(){
    95. echo -e "\n\e[32m================= $CPU_LOAD =================\e[0m"
    96. UTIL=`vmstat | awk '{if(NR==3) print 100-$15"%"}'` ##100-idle空闲的,NR==3处理第3行
    97. USER=`vmstat |awk '{if(NR==3) print $13"%"}'`
    98. SYS=`vmstat |awk '{if(NR==3) print $14"%"}'`
    99. IOWAIT=`vmstat |awk '{if(NR==3) print $16"%"}'`
    100. echo "Utile(使用率): $UTIL"
    101. echo "User use(用户使用率):$USER"
    102. echo "System use(系统使用率): $SYS"
    103. echo "I/O wait(I/O等待): $IOWAIT"
    104. echo
    105. }
    106. #硬盘I/O负载
    107. disk_load(){
    108. echo -e "\n\e[32m================= $DISK_LOAD =================\e[0m"
    109. UTIL=`iostat -x -k | awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'` ##OFS=": "表示以:或者空格分割
    110. READ=`iostat -x -k | awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`
    111. WRITE=`iostat -x -k | awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`
    112. IOWAIT=`vmstat |awk '{if(NR==3) print $16"%"}'`
    113. echo -e "Util:"
    114. echo -e "${UTIL}"
    115. echo "I/O wait: $IOWAIT"
    116. echo -e "I/O Wait: $IOWAIT"
    117. echo -e "Read/s: \n$READ"
    118. echo -e "Write/s: \n$WRITE"
    119. echo
    120. }
    121. #硬盘利用率
    122. disk_use(){
    123. echo -e "\n\e[32m================= $DISK_USE =================\e[0m"
    124. DISK_TOTAL=`fdisk -l |awk '/^(Disk|磁盘).*(bytes|字节)/ && /\/dev/{printf $2" ";print $3}'`
    125. USE_RATE=`df -h | awk '/^\/dev/{print int($5)}'` ##awk内置函数:int
    126. 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}'`
    127. echo "--------------------------"
    128. echo -e "Disk toltal:\n${DISK_TOTAL}"
    129. echo "--------------------------"
    130. echo -e "Disk used:\n${DISK_USED}"
    131. echo "--------------------------"
    132. echo
    133. }
    134. #硬盘inode利用率
    135. disk_inode(){
    136. echo -e "\n\e[32m================= $DISK_INODE =================\e[0m"
    137. 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}'`
    138. echo "--------------------------"
    139. echo -e "inode use:\n${INODE_USE}"
    140. echo "--------------------------"
    141. echo
    142. }
    143. #内存利用率
    144. mem_use(){
    145. echo -e "\n\e[32m================= $MEM_USE =================\e[0m"
    146. MEM_TOTAL=`free -m|awk '{if(NR==2)printf "%.1f" ,$2/1024} END{print "G"}'` ##%.1保留小数点1位,f是浮点型
    147. USE=`free -m|awk '{if(NR==2)printf "%.1f" ,$3/1024} END{print "G"}'`
    148. FREE=`free -m|awk '{if(NR==2)printf "%.1f" ,$4/1024} END{print "G"}'`
    149. echo -e "Total: $MEM_TOTAL"
    150. echo -e "Use:$USE"
    151. echo -e "Free : $FREE"
    152. echo
    153. }
    154. ##网络连接状态
    155. tcp_status(){
    156. echo -e "\n\e[32m================= $TCP_STATUS =================\e[0m"
    157. COUNT=`ss -ant|awk '!/State/{status[$1]++}END{for(i in status) print i,status[i]}'`
    158. 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}}'`
    159. echo "--------------------------"
    160. echo -e "TCP connection status:\n$COUNT"
    161. echo "--------------------------"
    162. echo -e "LISTEN:\n${LISTEN}"
    163. echo "--------------------------"
    164. echo
    165. }
    166. #占用CPU高的前10个进程
    167. cpu_top10(){
    168. echo -e "\n\e[32m================= $CPU_TOP_10 =================\e[0m"
    169. CPU_LOG=/tmp/cpu_top.tmp
    170. ##printf不带换行符,print会有换行符
    171. ##sort -k2按照第2列排序 -nr表示逆序
    172. 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
    173. ##循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列
    174. ##if((i==NF))printf $i"\n";else printf $i也可以写成:if((i==NF))printf{$i"\n"};else {printf $i'
    175. if [[ -n `cat $CPU_LOG` ]];then ##-n:字符串长度不是0的话
    176. #echo -e "\033[32m 参考值${i}\033[0m"
    177. cat $CPU_LOG
    178. >$CPU_LOG ##将文件清空
    179. else
    180. # echo "No process using the CPU"
    181. echo "没有使用cpu的进程"
    182. break
    183. fi
    184. echo
    185. }
    186. #占用内存高的前10个进程
    187. mem_top10(){
    188. echo -e "\n\e[32m================= $MEM_TOP_10 =================\e[0m"
    189. MEM_LOG=/tmp/mem_top.tmp
    190. ##printf不带换行符,print会有换行符
    191. ##sort -k2按照第2列排序 -nr表示逆序
    192. 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
    193. if [[ -n `cat $MEM_LOG` ]];then ##-n:字符串长度不是0的话
    194. cat $MEM_LOG
    195. >$MEM_LOG ##将文件清空
    196. else
    197. # echo "No process using the Memory"
    198. echo "没有使用内存的进程"
    199. break
    200. fi
    201. echo
    202. }
    203. #查看网络流量
    204. traffic(){
    205. echo -e "\n\e[32m================= $TRAFFIC =================\e[0m"
    206. tmp_file=/tmp/.rx_tx.tmp
    207. tmp_log=/tmp/.rx_tx.log
    208. {
    209. while true
    210. do
    211. devs=(`cat /proc/net/dev | sed -n '/:/p' | sed 's/:/ /g' | awk '{print $1}'`)
    212. RX_array_pre=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $2}'`)
    213. TX_array_pre=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $10}'`)
    214. sleep 1
    215. pid=`ps -ef|grep $0 |grep -v grep|awk 'NR==1{print $2}'`
    216. if [[ $$ -ne $pid || -e $tmp_file ]];then
    217. rm -rf $tmp_file
    218. break;
    219. fi
    220. RX_array_next=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $2}'`)
    221. TX_array_next=(`cat /proc/net/dev | awk '/:/' | sed 's/:/ /g' | awk '{print $10}'`)
    222. for i in `seq ${#RX_array_next[@]}`
    223. do
    224. RX_array[i-1]=$((${RX_array_next[i-1]}-${RX_array_pre[i-1]}))
    225. TX_array[i-1]=$((${TX_array_next[i-1]}-${TX_array_pre[i-1]}))
    226. if [[ ${RX_array[i-1]} -lt 1024 ]];then
    227. RX_array[i-1]="${RX_array[i-1]}B/s"
    228. elif [[ ${RX_array[i-1]} -gt 1048576 ]];then
    229. RX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')
    230. else
    231. RX_array[i-1]=$(echo ${RX_array[i-1]} | awk '{print $1/1024 "KB/s"}')
    232. fi
    233. if [[ ${TX_array[i-1]} -lt 1024 ]];then
    234. TX_array[i-1]="${TX_array[i-1]}B/s"
    235. elif [[ ${TX_array[i-1]} -gt 1048576 ]];then
    236. TX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1048576 "MB/s"}')
    237. else
    238. TX_array[i-1]=$(echo ${TX_array[i-1]} | awk '{print $1/1024 "KB/s"}')
    239. fi
    240. done
    241. clear
    242. echo -e "\n\e[32m================= $TRAFFIC =================\e[0m" >> $tmp_log
    243. echo -e "`date '+%Y-%m-%d %H:%M:%S'`\n" >> $tmp_log
    244. printf "%-15s%-15s%-15s\n" "DEV" "RX(下行)" "TX(上行)" >> $tmp_log
    245. for i in `seq ${#RX_array_next[@]}`
    246. do
    247. printf "%-15s%-15s%-15s\n" ${devs[i-1]} ${RX_array[i-1]} ${TX_array[i-1]} >> $tmp_log
    248. done
    249. cat $tmp_log
    250. > $tmp_log
    251. echo -n -e "\n(q for quit): "
    252. done
    253. } &
    254. while true
    255. do
    256. read flag
    257. if [[ "$flag" = "q" ]];then
    258. touch $tmp_file
    259. break;
    260. fi
    261. done
    262. }
    263. echo "$TITLE"
    264. while [[ true ]]; do
    265. read -p "$ACTION" command
    266. case "$command" in
    267. m )
    268. help
    269. ;;
    270. q )
    271. exit 0
    272. ;;
    273. 1 )
    274. cpu_load
    275. ;;
    276. 2 )
    277. disk_load
    278. ;;
    279. 3 )
    280. disk_use
    281. ;;
    282. 4 )
    283. disk_inode
    284. ;;
    285. 5 )
    286. mem_use
    287. ;;
    288. 6 )
    289. tcp_status
    290. ;;
    291. 7 )
    292. cpu_top10
    293. ;;
    294. 8 )
    295. mem_top10
    296. ;;
    297. 9 )
    298. traffic
    299. ;;
    300. * )
    301. help
    302. ;;
    303. esac
    304. done