1. 程式人生 > >Linux伺服器記憶體、CPU、檔案系統、磁碟IO效能以及網路連通性shell巡檢

Linux伺服器記憶體、CPU、檔案系統、磁碟IO效能以及網路連通性shell巡檢

shell自動巡檢伺服器基礎配置

         每個專案都要部署在伺服器上,那麼伺服器的安全效能和一些基本情況是我們需要了解的,比如伺服器CPU、記憶體、檔案系統、磁碟IO、還有一些網路連通性等等,這些操作很多專案組都是安排一個特定的巡檢人員來完成,那麼為什麼不寫一個shell指令碼來自動巡檢伺服器而代替人工操作呢,下面給出巡檢的標準與shell指令碼程式碼:

一、巡檢標準

1.1 CPU利用率巡檢

1) 執行巡檢指令(紅色字型部分):

top,結果示例如下,該顯示結果每隔3重新整理一次。按【q】鍵可退出巡檢



2) 關注圖中紅色標記部分,連續三次及以上低於20%認為CPU佔用率過高,系統存在風險。

1.2 記憶體利用率巡檢

1) 執行巡檢指令(紅色字型部分): free -g(-g意義是單位為GB)結果示例如下。



2) 關注圖中紅色標記部分,若低於總量的20% (GB)認為記憶體佔用率過高,系統存在風險。

1.3 檔案系統巡檢

1) 執行巡檢

指令(紅色字型部分):df -h,結果示例如下。



2) 關注圖中紅色標記部分,若任意一條記錄高於90%認為磁碟空間佔用率過高,系統存在風險。

1.4 磁碟IO效能巡檢

1) 執行巡檢指令(紅色字型部分):iostat  –x 2 5,結果示例如下,該顯示結果每隔2重新整理一次共執行5




2) 關注圖中紅色標記部分,若scvtm超過15,且%util接近100連續三次及以上,認為磁碟IO可能存在瓶頸,系統存在風險。

1.5 網路連通性巡檢

1)執行巡檢指令(紅色字型部分):ping -s 4096 -c 5  135.0.51.12,結果示例如下。


  



2) 關注圖中紅色標記部分,若高於0%認為資料庫到該目標IP之間的網路不穩定,存在丟包,系統存在風險。


二、巡檢shell程式碼

巡檢結果若系統正常則不管,異常則輸出到指定檔案裡面。


#!/bin/bash
#admin:spirits

#CPU檢測**
echo "date '+%Y年%m月%d日 %H:%M:%S' 資料庫伺服器硬體情況開始巡檢。。。"

top -bn 6 >>top

grep -n “%id” top >> newtop

grep -n “zombie” top >> insisttop

top1=cat newtop | awk '{print $5}' | sed -n 4p | sed 's/%//g' |sed 's/id,//g'
top2=cat newtop | awk '{print $5}' | sed -n 5p | sed 's/%//g' |sed 's/id,//g'
top3=cat newtop | awk '{print $5}' | sed -n 6p | sed 's/%//g' |sed 's/id,//g'

top4=cat insisttop | awk '{print $10}' | sed -n 2p | sed 's/%//g' |sed 's/id,//g'

#echo “top4:$top4”

if [ $top4 -gt 0 ]

then
echo "date '+%Y年%m月%d日 %H:%M:%S' 採集處理伺服器上出現殭屍程序,巡檢程式將自動kill該程序,如需人工確認請執行命令top後再執行ps -A -ostat,ppid,pid,cmd | grep -e '1'來確認是否將殭屍程序殺死" >> ./newreport.txt

ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

else
echo "date '+%Y年%m月%d日 %H:%M:%S' 採集處理伺服器上無殭屍程序正常執行!"
fi

a= t o p 1 : 0 : 2 b = {top1:0:2} b= {top2:0:2}
c=${top3:0:2}

echo “top1: $a”
echo “top2: $b”
echo “top3: $c”

if [ $a -lt 20 ]&&[ $b -lt 20 ]&&[ $c -lt 20 ] ; then

echo  "`date '+%Y年%m月%d日 %H:%M:%S'` 資料庫伺服器CPU佔用率不正常,top取到的值是$top1,$top2,$top3,小於參考值20,請及時處理!" >> ./newreport.txt

else

echo “CPU佔用率正常!”

fi

rm -rf top

rm -rf newtop

rm -rf insisttop

#****記憶體檢測
free1=free -g | awk '{print $4}' | sed -n 3p | sed 's/%//g' |sed 's/t//g'

total=free -g | awk '{print $2}' | sed -n 2p | sed 's/%//g' |sed 's/t//g'

canshu=0.2

tempd=echo $total $canshu |awk '{print $1*$2}'

biaozhun=${tempd%.*}

if [ $free1 -le b i a o z h u n ] ; t h e n e c h o " d a t e + biaozhun ] ; then echo "`date '+%Y年%m月%d日 %H:%M:%S'` 資料庫伺服器記憶體佔用率過高,free -g取到的值是 free1,小於等於參考值$biaozhun,請及時處理!" >> ./newreport.txt

else

echo “記憶體佔用率正常!”

fi

#****檔案系統巡檢
df1=df -h | awk '{print $5}' | sed -n 2p | sed 's/%//g'
df2=df -h | awk '{print $5}' | sed -n 3p | sed 's/%//g'
df3=df -h | awk '{print $5}' | sed -n 4p | sed 's/%//g'
df4=df -h | awk '{print $5}' | sed -n 5p | sed 's/%//g'
df5=df -h | awk '{print $5}' | sed -n 6p | sed 's/%//g'

if [ $df1 -gt 90 ]||[ $df2 -gt 90 ]||[ $df3 -gt 90 ]||[ $df4 -gt 90 ]||[ $df5 -gt 90 ] ; then

echo "`date '+%Y年%m月%d日 %H:%M:%S'` 資料庫伺服器磁碟佔用率過高!df -h取到的值是$df1,$df2,$df3,$df4,$df5,參考值是90,若其中一個或一個以上大於參考值,請及時處理!" >> ./newreport.txt

else

echo "磁碟佔用率正常!"

fi

#******磁碟IO效能巡檢
iostat -x 2 5 >>iostat.txt

scvtm1=" cat iostat.txt | awk '{print $11}' | sed -n 16p | sed 's/%//g'"

scvtm2="cat iostat.txt | awk '{print $11}' | sed -n 17p | sed 's/%//g'"

scvtm3="cat iostat.txt | awk '{print $11}' | sed -n 18p | sed 's/%//g'"

scvtm4="cat iostat.txt | awk '{print $11}' | sed -n 19p | sed 's/%//g'"

scvtm13="cat iostat.txt | awk '{print $11}' | sed -n 25p | sed 's/%//g'"

scvtm6=" cat iostat.txt | awk '{print $11}' | sed -n 26p | sed 's/%//g'"

scvtm7="cat iostat.txt | awk '{print $11}' | sed -n 27p | sed 's/%//g'"

scvtm8="cat iostat.txt | awk '{print $11}' | sed -n 28p | sed 's/%//g'"

scvtm9="cat iostat.txt | awk '{print $11}' | sed -n 34p | sed 's/%//g'"

scvtm10="cat iostat.txt | awk '{print $11}' | sed -n 35p | sed 's/%//g'"

scvtm11="cat iostat.txt | awk '{print $11}' | sed -n 36p | sed 's/%//g'"

scvtm12="cat iostat.txt | awk '{print $11}' | sed -n 37p | sed 's/%//g'"

util1="cat iostat.txt | awk '{print $12}' | sed -n 16p | sed 's/%//g'"

util2="cat iostat.txt | awk '{print $12}' | sed -n 17p | sed 's/%//g'"

util3="cat iostat.txt | awk '{print $12}' | sed -n 18p | sed 's/%//g'"

util4="cat iostat.txt | awk '{print $12}' | sed -n 19p | sed 's/%//g'"

util5="cat iostat.txt | awk '{print $12}' | sed -n 25p | sed 's/%//g'"

util6=" cat iostat.txt | awk '{print $12}' | sed -n 26p | sed 's/%//g'"

util7="cat iostat.txt | awk '{print $12}' | sed -n 27p | sed 's/%//g'"

util8="cat iostat.txt | awk '{print $12}' | sed -n 28p | sed 's/%//g'"

util9="cat iostat.txt | awk '{print $12}' | sed -n 34p | sed 's/%//g'"

util10="cat iostat.txt | awk '{print $12}' | sed -n 35p | sed 's/%//g'"

util11="cat iostat.txt | awk '{print $12}' | sed -n 36p | sed 's/%//g'"

util12="cat iostat.txt | awk '{print $12}' | sed -n 37p | sed 's/%//g'"

#1/2/3/4*****

maxa=echo "$scvtm1 $scvtm2 $scvtm3 $scvtm4" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#13/6/7/8/*

maxb=echo "$scvtm13 $scvtm6 $scvtm7 $scvtm8" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#*******9/10/11/12

maxc=echo "$scvtm9 $scvtm10 $scvtm11 $scvtm12" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#util1/2/3/4**

maxd=echo "$util1 $util2 $util3 $util4" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#***util5/6/7/8

maxe=echo "$util5 $util6 $util7 $util8" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#********util9/10/11/12

maxf=echo "$util9 $util10 $util11 $util12" | awk '{for(i=1;i<=NF;i++)$i>a?a=$i:a}END{print a}'

#做判斷******
m=${maxa:0:1}

n=${maxb:0:1}

h=${maxc:0:1}

k=${maxd:0:1}

l=${maxe:0:1}

o=${maxf:0:1}

if [ $m -ge 15 ]&&[ $k -ge 99 ]&&[ k l t 100 ] k -lt 100 ] $[ $n -ge 15 ]&&[ $l -ge 99 ]&&[ $l -lt 100 ]&&[ $h -ge 15]&&[ $o -ge 99 ]&&[ $o -lt 100 ]

then

echo "`date '+%Y年%m月%d日 %H:%M:%S'`  資料庫伺服器磁碟IO存在瓶頸,請及時處理!" >> ./newreport.txt

else

echo “磁碟IO正常!”

fi

rm -rf ./iostat.txt

#***********網路連通性檢測

network1=ping -s 4096 -c 5 135.0.51.15 | awk '{print $6}' | sed -n 9p | sed 's/%//g' |sed 's/t//g'

if [ $network1 -gt 0 ]

then

echo "date '+%Y年%m月%d日 %H:%M:%S' 資料庫伺服器到該目標IP之間的網路不穩定,ping取到的值是$network1,大於參考值是0,系統存在風險,請及時處理!" >> ./newreport.txt

else

echo “網路連通性正常!”

fi

echo "date '+%Y年%m月%d日 %H:%M:%S' 資料庫伺服器硬體情況巡檢結束!"




















  1. Zz ↩︎