Linux 系统监控shell脚本
比较粗略的一个脚本:主要监控系统磁盘、CPU、内存、网络流量、tcp连接数等
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | [root@ test system_monitor_shell_script] # cat system_monitor.sh #!/bin/bash #. /home/hduser/modify_system_variable.sh . /data/script_ssh/system_monitor_shell_script/modify_system_variable .sh #1、系统基本信息 ################################################################ echo -e "\033[32m############# 系统时间 #############\033[0m" echo System_Now_Time: ` date "+%Y-%m-%d %H:%M:%S" ` #获取系统时间也可以使用who -b echo System_Boot_Time: ` date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" + "%Y-%m-%d %H:%M:%S" ` echo -e "\033[32m############ 主机名 ###############\033[0m" echo Hostname: ` hostname ` echo -e "\033[32m########## Ip地址和网卡流量 ##########\033[0m" #获取服务器的网卡和IP地址,以便在网卡流量监控时使用。 for Network in ` ifconfig | awk -F : '/^[[:alpha:]]/{print $1}' ` do FLOWA= /tmp/ .$Network grep $Network: /proc/net/dev | awk -F: '{print $2}' | awk '{print "INPUT " $1 " " "OUTPUT " $9}' > $FLOWA #第一次获取网卡流量,单位字节 INPUTA=` awk '{print $2}' $FLOWA` OUTPUTA=` awk '{print $4}' $FLOWA` #获取网卡流量间隔时间 sleep $NETTIME #第二次获取网卡流量,单位字节 grep $Network: /proc/net/dev | awk -F: '{print $2}' | awk '{print "INPUT " $1 " " "OUTPUT " $9}' > $FLOWA INPUTB=` awk '{print $2}' $FLOWA` OUTPUTB=` awk '{print $4}' $FLOWA` #计算 #转换网卡流量单位为KB INPUTC=` echo -e "$INPUTB-$INPUTA" | bc ` OUTPUTC=` echo -e "$OUTPUTB-$OUTPUTA" | bc ` INPUTMBA=` echo -e $INPUTC | awk '{printf "%0.3f\n",$1/1024}' ` OUTPUTMBA=` echo -e $OUTPUTC | awk '{printf "%0.3f\n",$1/1024}' ` INPUT=` echo -e $INPUTC | awk '{printf "%0.3f\n",$1/1024/1024}' ` OUTPUT=` echo -e $OUTPUTB | awk '{printf "%0.3f\n",$1/1024/1204}' ` #判断网卡流量使用量 if [ $INPUTC - le 1048576 ]; then if [ $OUTPUTC - le 1048576 ]; then echo Network_Card: $Network Ip: ` /sbin/ifconfig $Network| grep "inet " | awk '{print $2}' ` "输入流量: " ${INPUTMBA}K /S "输出流量: " "${OUTPUTMBA}K/S " else echo Network_Card: $Network Ip: ` /sbin/ifconfig $Network| grep "inet " | awk '{print $2}' ` "输入流量: " ${INPUTMBA}K /S "输出流量: " "${OUTPUT}M/S " fi elif [ $INPUTC -gt 1048576 ]; then if [ $OUTPUTC -gt 1048576 ]; then echo Network_Card: $Network Ip: ` /sbin/ifconfig $Network| grep "inet " | awk '{print $2}' ` "输入流量: " ${INPUT}M /S "输出流量: " "${OUTPUTMBA}K/S " else echo Network_Card: $Network Ip: ` /sbin/ifconfig $Network| grep "inet " | awk '{print $2}' ` "输入流量: " ${INPUT}M /S "输出流量:" "${OUTPUT}M/S " fi fi done #2、CPU监控 ############################################################## echo -e "\033[32m############### CPU平均负载和系统进程数 ##############\033[0m" #us(user time):用户进程执行消耗cpu时间;sy(system time):系统进程执行消耗cpu时间;id:空闲时间(包括IO等待时间);wa:等待IO时间。 #CPULIMIT=90 CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p' ) CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p' ) CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p' ) CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p' ) CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p' ) #计算服务器CPU使用率 CPU1=` cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' ` sleep $CPUTIME CPU2=` cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' ` IDLE1=` echo -e $CPU1 | awk '{print $4}' ` IDLE2=` echo -e $CPU2 | awk '{print $4}' ` CPU1_TOTAL=` echo -e $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}' ` CPU2_TOTAL=` echo -e $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}' ` IDLE=` echo -e "$IDLE2-$IDLE1" | bc ` CPU_TOTAL=` echo -e "$CPU2_TOTAL-$CPU1_TOTAL" | bc ` RATE=` echo -e "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}' ` echo "用户进程占用CPU时间: us=$CPU_us" ; echo "系统进程消耗CPU时间: sy=$CPU_sy" ; echo "CPU空闲时间: id=$CPU_id" ; echo "等待I/O时间: wa=$CPU_wa" ; echo "CPU使用率: ${RATE}%" CPU_RATE=` echo -e $RATE | cut -d. -f1` load_average=$(uptime | gawk -F ':' '{print $NF}' ) running_process=$( top -b -d 1 -n 1 | sed -n '2p' | awk -F ',' '{print $2}' | awk '{print $1}' ) #running_process=`ps aux |wc -l` total_process=$( ps -ef | wc -l) echo echo "CPU_load_average: ${load_average}" echo "running_process:" " " ${running_process} echo "total_process:" " " ${total_process} Host_running_time=$(uptime | sed 's/^.*up//' | awk -F "," '{print $1}' ) User_connection_number=$(uptime | cut -d , -f 3| awk '{print $1}' ) #cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒\n",run_days,run_hour,run_minute,run_second)}' echo -e "Host_running_time: `cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(" %d天%d时%d分%d秒\n ",run_days,run_hour,run_minute,run_second)}'`" echo -e "User_connection_number: ${User_connection_number}\n" #CPU占用最多的十个进程 CPUA=` expr $RATE \> $CPULIMIT` if [ $CPUA - eq 1 ]; then echo "$time1 CPU警告:当前CPU使用率$RATE%,大于$CPULIMIT%" ; echo \ ; echo "process使用CPU情况:" ps aux | sort -k3nr | head | awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%CPU","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$3,$11}' fi echo #3、内存监控 #################################################################### echo -e "\033[32m########### 系统内存使用情况 ##############\033[0m" #内存使用情况 #MEMLIMIT=80 Total_Mem=$( free -m | sed -n '2p' | awk '{print $2}' ) Usage_Mem=$( free -m | sed -n '2p' | awk '{print $3}' ) Free_Mem=$( free -m | sed -n '2p' | awk '{print $4}' ) Mem_Usage_Percent=` free -m | sed -n '2p' | awk '{printf "%-1d",$3/$2*100}' ` #交换分区使用情况 Swap_Total_Mem=$( free -m | grep Swap | sed -n 'p' | awk '{print $2}' ) Swap_Usage_Mem=$( free -m | grep Swap | sed -n 'p' | awk '{print $3}' ) Swap_Free_Mem=$( free -m | grep Swap | sed -n 'p' | awk '{print $4}' ) Swap_Mem_Usage_Percent=` free -m | grep Swap| sed -n 'p' | awk '{printf "%-1d",$3/$2*100}' ` echo "总内存:" ${Total_Mem}M echo "使用内存: ${Usage_Mem}M" ; echo "剩余内存: ${Free_Mem}M" echo -e "内存使用率: ${Mem_Usage_Percent}%\n" echo "交换分区使用情况:" echo "总内存: ${Swap_Total_Mem}M" ; echo "使用内存: ${Swap_Usage_Mem}M" echo "剩余内存: ${Swap_Free_Mem}M" ; echo -e "使用率: ${Swap_Mem_Usage_Percent}%\n" #判断内存使用是否超过80% MA=` expr $Mem_Usage_Percent \> $MEMLIMIT` if [ $MA - eq 1 ]; then echo "$time1 内存警告,当前内存使用$Mem_Usage_Percent% 大于$MEMLIMIT%" fi MB=` expr $Swap_Mem_Usage_Percent \> $MEMLIMIT` if [ $MB - eq 1 ]; then echo "$time1 内存警告,当前内存$Swap_Mem_Usage_Percent% 大于$MEMLIMIT%" fi echo "process使用内存情况:" ps aux | sort -k4nr | head | awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}' #PCPID=`ps aux |sort -k4nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}' |grep -v -i user |awk '{print $2}'` #PDMEM=`ps aux |sort -k4nr |head |awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","USER","PID","%MEM","COMMAND"}{printf "%-10s%-10d%-10.1f%-10s\n",$1,$2,$4,$11}' |grep -v -i user |awk '{print $3}'` #for i in $PCPID #do # echo $i;ps -ef |grep $i |awk '{print $NF}' |head -1 #done echo #4、磁盘监控 ################################################################# #ROOT=80 #VAR=90 #HOME=90 #BOOT=80 #DATA=90 NULL= /dev/null echo -e "\033[32m############### 磁盘使用情况 ################\033[0m" disk= /tmp/ .disk #parted适用于Ubuntu #parted -l |grep -i 'disk' |grep '/dev/[a-z]d[a-z]' |awk -F: '{print $1}' |awk '{print $2}' > /tmp/.disknumber #/sbin/fdisk -l |grep -i 'disk' |grep '/dev/[a-z]d[a-z]' |awk -F: '{print $1}' |awk '{print $2}' > /tmp/.disknumber disk_data_usage=` df -h | grep "data$" | awk '{print $5}' | awk -F% '{print $1}' ` disk_root_usage=` df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}' ` disk_home_usage=` df -h | grep "home$" | awk '{print $5}' | awk -F% '{print $1}' ` disk_var_usage=` df -h | grep "var" | awk '{print $5}' | awk -F% '{print $1}' ` disk_boot_usage=` df -h | grep "boot" | awk '{print $5}' | awk -F% '{print $1}' ` disk_data2_usage=` df -h | grep "data2" | awk '{print $5}' | awk -F% '{print $1}' ` disk_data3_usage=` df -h | grep "data3" | awk '{print $5}' | awk -F% '{print $1}' ` disk_data4_usage=` df -h | grep "data4" | awk '{print $5}' | awk -F% '{print $1}' ` disk_data5_usage=` df -h | grep "data5" | awk '{print $5}' | awk -F% '{print $1}' ` #获取磁盘分区使用情况 df -h | awk '{print $NF}' > /tmp/ .disk grep home $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_home_usage - ge $HOME ]; then echo " " /home 分区警告:当前使用$disk_home_usage%,大于$HOME else echo " " 当前 /home 分区使用: " " $disk_home_usage% fi fi grep "/$" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_root_usage - ge $ROOT ]; then echo " " /分区警告:当前使用$disk_root_usage%,大于$ROOT else echo " " 当前/分区使用: " " $disk_root_usage% fi fi grep "var" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_var_usage - ge $VAR ]; then echo " " /var 分区警告:当前使用$disk_var_usage%,大于$VAR else echo " " 当前 /var 分区使用: " " $disk_var_usage% fi fi grep "boot" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_boot_usage - ge $BOOT ]; then echo " " /boot 分区警告:当前使用$disk_boot_usage%,大于$BOOT else echo " " 当前 /boot 分区使用: " " $disk_boot_usage% fi fi grep "data" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_data_usage - ge $DATA ]; then echo " " /data 分区警告:当前使用$disk_data_usage%,大于$DATA else echo " " 当前 /data 分区使用: " " $disk_data_usage% fi fi grep "data2" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_data2_usage - ge $DATA ]; then echo " " /data2 分区警告:当前使用$disk_data2_usage%,大于$DATA else echo " " 当前 /data2 分区使用: " " $disk_data2_usage% fi fi grep "data3" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_data3_usage - ge $DATA ]; then echo " " /data3 分区警告:当前使用$disk_data3_usage%,大于$DATA else echo " " 当前 /data3 分区使用: " " $disk_data3_usage% fi fi grep "data4" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_data4_usage - ge $DATA ]; then echo " " /data4 分区警告:当前使用$disk_data4_usage%,大于$DATA else echo " " 当前 /data4 分区使用: " " $disk_data4_usage% fi fi grep "data5" $disk > $NULL if [ $? - eq 0 ]; then if [ $disk_data5_usage - ge $DATA ]; then echo " " /data5 分区警告:当前使用$disk_data5_usage%,大于$DATA else echo " " 当前 /data5 分区使用: " " $disk_data5_usage% fi fi echo #5、连接数 ###################################################################### tcpfile= /tmp/ .tcp #查看并发连接数 #描述 #CLOSED:无连接是活动的或正在进行 #LISTEN:服务器在等待进入呼叫 #SYN_RECV:一个连接请求已经到达,等待确认 #SYN_SENT:应用已经开始,打开一个连接 #ESTABLISHED:正常数据传输状态 #FIN_WAIT1:应用说它已经完成 #FIN_WAIT2:另一边已同意释放 #ITMED_WAIT:等待所有分组死掉 #CLOSING:两边同时尝试关闭 #TIME_WAIT:另一边已初始化一个释放 #LAST_ACK:等待所有分组死掉 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' > $tcpfile grep TIME_WAIT $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "TIME_WAIT 0 " >> $tcpfile fi grep FIN_WAIT1 $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "FIN_WAIT1 0 " >> $tcpfile fi grep FIN_WAIT2 $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "FIN_WAIT2 0 " >> $tcpfile fi grep CLOSE_WAIT $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "CLOSE_WAIT 0 " >> $tcpfile fi grep LAST_ACK $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "LAST_ACK 0 " >> $tcpfile fi grep SYN_RECV $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "SYN_RECV 0 " >> $tcpfile fi grep CLOSING $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "CLOSING 0 " >> $tcpfile fi grep ESTABLISHED $tcpfile > $NULL if [ $? - eq 1 ] ; then echo "ESTABLISHED 0 " >> $tcpfile fi TIME_WAITV=` grep TIME_WAIT $tcpfile | awk '{print $2}' ` FIN_WAIT1V=` grep FIN_WAIT1 $tcpfile | awk '{print $2}' ` FIN_WAIT2V=` grep FIN_WAIT2 $tcpfile | awk '{print $2}' ` ESTABLISHEDV=` grep ESTABLISHED $tcpfile | awk '{print $2}' ` SYN_RECVV=` grep SYN_RECV $tcpfile | awk '{print $2}' ` CLOSINGV=` grep CLOSING $tcpfile | awk '{print $2}' ` CLOSE_WAITV=` grep CLOSE_WAIT $tcpfile | awk '{print $2}' ` LAST_ACKV=` grep LAST_ACK $tcpfile | awk '{print $2}' ` echo -e "\033[32m###########Tcp连接数##################\033[0m" echo " " 当前TIME_WAIT " " 连接数为 $TIME_WAITV 个。 echo " " 当前FIN_WAIT1 " " 连接数为 $FIN_WAIT1V 个。 echo " " 当前FIN_WAIT2 " " 连接数为 $FIN_WAIT2V 个。 echo " " 当前CLOSE_WAIT " " 连接数为 $CLOSE_WAITV 个。 echo " " 当前ESTABLISHED "" 连接数为 $ESTABLISHEDV 个。 echo " " 当前SYN_RECV " " 连接数为 $SYN_RECVV 个。 echo " " 当前LAST_ACKV " " 连接数为 $LAST_ACKV 个。 echo " " 当前CLOSING " " 连接数为 $CLOSINGV 个。; echo \ ; echo -e "\033[31m ----------------------------END--------------------------\033[0m" |
1 | modify_system_variable.sh文件如下<br><br> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash #计算CPU利用率的时间间隔。 CPUTIME=2 # 单位 s #CPU限制,当系统使用CPU达到下面值时报警。 CPULIMIT=90 #单位 % #内存限制,当系统使用内存达到下面值时报警。 MEMLIMIT=80 #单位 % #磁盘监控。 ROOT=80 # / 分区使用限制。单位 % VAR=90 # var 分区使用限制。 单位 % HOME=90 # home 分区使用限制。单位 % BOOT=80 # boot 分区使用限制。 单位 % DATA=90 # data1 分区使用限制。单位 % #计算网卡流量时间间隔 NETTIME=3 #单位 s |
记录学习和生活的酸甜苦辣.....哈哈哈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫