天天看點

CentOS系統主機每日巡檢腳本

1、由于運維工程師的工作需要,要求每日對伺服器進行線上巡檢,巡檢的名額有系統狀态資訊、CPU、記憶體、硬碟、網絡這幾個大項,

是以編寫了一個shell腳本,用于主機每日巡檢

這個巡檢腳本需要保證SSH服務正常通路,并且需要登入root使用者,進行腳本運作

#!/bin/bash
# @Author: danqing
# @Description: Host Daily Check Script
# beseem CentOS6.X CentOS7.X
# 
echo "Host Daily Check Script"
[ $(id -u) -gt 0 ] && echo "請用root使用者執行此腳本!" && exit 1


if [ ! -d /root/check_log  ];then
  mkdir /root/check_log
  echo "/root/check_log檢查日志存放目錄建立成功"
else
  echo "/root/check_log檢查日志存放目錄已存在"
fi


function getSystem(){
echo ""
echo ""
echo "############################ 系統資訊檢查 ############################"
Default_LANG=${LANG}
OS=$(uname -o)
Release=$(cat /etc/redhat-release 2>/dev/null)
Kernel=$(uname -r)
Hostname=$(uname -n)
Nowdate=$(date +'%F %T')
LastReboot=$(who -b | awk '{print $3,$4}')
uptime=$(uptime | sed 's/.*up \([^,]*\), .*/\1/')
echo " 語言環境: $Default_LANG"
echo " 系統: $OS"
echo " 發行版本: $Release"
echo " 核心: $Kernel"
echo " 主機名: $Hostname"
echo " 目前時間: $Nowdate"
echo " 最後啟動: $LastReboot"
echo " 運作時間: $uptime"
}


function getCpu(){
echo ""
echo ""
echo "############################ CPU檢查 ############################"
Physical_CPUs=$(grep "physical id" /proc/cpuinfo| sort | uniq | wc -l)
Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
CPU_Kernels=$(grep "cores" /proc/cpuinfo|uniq| awk -F ': ' '{print $2}')
CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
CPU_Hz=$(cat /proc/cpuinfo | grep "cpu MHz" | uniq | awk -F':' '{sub(/ /,"",$2);printf "%s MHz\n",$2}')
CPU_Arch=$(uname -m)
CPU_Usage=$(cat /proc/loadavg | awk '{print $1}')
echo "實體CPU個數: $Physical_CPUs"
echo "邏輯CPU個數: $Virt_CPUs"
echo "每CPU核心數: $CPU_Kernels"
echo "CPU型号: $CPU_Type"
echo "CPU頻率: $CPU_Hz"
echo "CPU架構: $CPU_Arch"
echo "CPU使用率: ${CPU_Usage}%"
}


function getMemory(){
echo ""
echo ""
echo "############################ 記憶體檢查 ############################"
Memory_Used=$(awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024/1024}'  /proc/meminfo)
Memory_Total=$(awk '/MemTotal/{total=$2}END{print (total)/1024/1024}' /proc/meminfo)
# kb的換算是1000 kB的換算是1024
Memory_Usage=$(awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/total*100}'  /proc/meminfo)
echo "已使用記憶體/全部記憶體: ${Memory_Used}GB/${Memory_Total}GB"
echo "記憶體使用率: ${Memory_Usage}%"
}


function getDisk(){
echo ""
echo ""
echo "############################ 硬碟檢查 ############################"
Disk_Count=$(lsblk |awk '/disk/{print $1}'|wc -l)
echo "硬碟數量: ${Disk_Count}個"
echo "硬碟分區情況: "
echo "`df -hTP | sort |grep -E "/sd|/mapper" |awk '{print ($1 "\t\n" "  檔案系統"$2 "  合計"$3 "  已用"$4 "  剩餘"$5 "  使用率"$6 "  挂載點"$7)}'`"
# -P, --portability 使用 POSIX 輸出格式,友善shell過濾處理
smartctl -V >&/dev/null
if [ $? -eq 0 ]; then
    echo "smartctl工具已安裝,可以進行硬碟健康檢測: "
    for i in $(lsblk |awk '/disk/{print $1}')
    do
      echo "硬碟"$i   `smartctl -H /dev/$i |grep -Ei "OK|PASSED|FAILED|Failure|Failed"`
    done
else
    echo "smartctl工具未安裝,無法進行硬碟健康檢測"
fi
# "\n磁盤IO資訊:$(iotop -bon 1 &>/dev/null || echo 'iotop 未安裝資訊擷取失敗')"
}


function getNetwork(){
echo ""
echo ""
echo "############################ 網絡檢查 ############################"
Network_Device=$(cat /proc/net/dev | awk 'NR>2 && $1 !~/lo/ {sub(/:/,"");print $1}')
for i in $Network_Device
do
  echo "網卡:$i  狀态: $(ip link show $Network_Device | awk 'NR==1{print $9}') RX: $(ethtool -g $Network_Device | grep "RX:" | tail -1 | awk '{print $2}') TX: $(ethtool -g $Network_Device | grep "TX:" | tail -1 | awk '{print $2}')"
  # rx是接收(receive),tx是發送(transport)
  Mac_Info=$(ip link | egrep -v "lo" | grep link | awk '{print $2}')
  echo "MAC位址: $Mac_Info"
  Private_Ip=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
  echo "IP位址: $Private_Ip"
  # Public_Ip=$(curl ifconfig.me -s)
  # echo "公網IP位址: $Public_Ip"
  Gateway=$(ip route | grep default | awk '{print $3}')
  # echo "網關位址: $Gateway"
  # Dns_Config=$(grep nameserver /etc/resolv.conf| grep -v "#" | awk '{print $2}' | tr '\n' ',' | sed 's/,$//')
  # echo "DNS位址: $Dns_Config"
  echo "網關連接配接情況: $(ping -c 4 -i 0.5 -W 3 $Gateway &>/dev/null && echo '正常通信' || echo '無法通信')"
  echo "外網連接配接情況: $(ping -c 4 -i 0.5 -W 3 baidu.com &>/dev/null && echo '正常通信' || echo '無法通信')"
  # 發送4次請求包,每次間隔0.5秒,最長等待時間為3秒
done
Listen_Port=$(ss -tuln | grep LISTEN | awk '{print $5}' | awk -F: '{print $2$4}' | sort |uniq -d | tr '\n' ',' | sed 's/,$//')
echo "系統運作的端口: $Listen_Port"
}


function check(){
echo "Host Daily Check Script"
getSystem
getCpu
getMemory
getDisk
getNetwork
}


RESULTFILE="/root/check_log/check-`date +%Y%m%d`.txt"
check > $RESULTFILE
echo "檢查結果:$RESULTFILE"
           

2、該腳本适用于CentOS6.X CentOS7.X系統,打開終端連接配接到需要巡檢的主機

vim host_check.sh
           
CentOS系統主機每日巡檢腳本

3、按i鍵,然後粘貼上述代碼

CentOS系統主機每日巡檢腳本

4、代碼太長,并沒有截全部,隻截取一部分示例

儲存退出,然後運作

sh host_check.sh
           
CentOS系統主機每日巡檢腳本

5、檢視巡檢日志

vim /root/check_log/check-20221027.txt
           
CentOS系統主機每日巡檢腳本

6、smartctl工具未安裝,無法進行硬碟健康檢測

出現這個提示,隻需要安裝一下就行

yum install smartmontools -y
           
CentOS系統主機每日巡檢腳本

 然後重新運作巡檢腳本,輸出巡檢日志