小易说IT 小易说IT

Linux服务器巡检shell脚本

适配 Linux(openEuler / CentOS / Debian / Ubuntu),配合 crontab 使用,自带日志、超时控制、过期清理、异常标记;脚本内全部使用绝对路径,规避 crontab 环境变量坑。

前置准备

# 创建存放目录
mkdir -p /opt/scripts /opt/scripts/log /opt/backup/db
# 赋权
chmod 700 /opt/scripts /opt/backup/db

服务器巡检脚本 server_check.sh

功能:CPU、内存、磁盘、inode、负载、进程端口,输出巡检报告,异常标红写入日志,保留历史巡检文件,自动清理旧报告

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export LANG=en_US.UTF-8

# ===================== 配置区 =====================
LOG_BASE="/opt/scripts/log"
TIME=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="${LOG_BASE}/server_check_${TIME}.txt"
RETENTION_DAY=7  # 巡检报告保留7天
# 告警阈值
CPU_THRESH=85
MEM_THRESH=85
DISK_THRESH=90
LOAD_THRESH=$(nproc)
# ==================================================

echo "==================== 服务器巡检 ${TIME} ====================" > ${REPORT_FILE}
echo "主机名: $(hostname)" >> ${REPORT_FILE}
echo "IP地址: $(hostname -I | awk '{print $1}')" >> ${REPORT_FILE}
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | sed 's/"//g')" >> ${REPORT_FILE}
echo "" >> ${REPORT_FILE}

# 1.CPU负载
echo "===== CPU信息 =====" >> ${REPORT_FILE}
CPU_IDLE=$(top -b -n1 | grep Cpu | awk '{print $8}' | cut -d'%' -f1)
CPU_USE=$(echo 100 - ${CPU_IDLE} | bc)
LOAD1=$(uptime | awk '{print $(NF-2)}' | sed 's/,//')
echo "CPU使用率: ${CPU_USE}%" >> ${REPORT_FILE}
echo "1分钟负载: ${LOAD1},CPU核数: $(nproc)" >> ${REPORT_FILE}
if (( $(echo "${CPU_USE} > ${CPU_THRESH}" | bc -l) ));then
    echo "[警告] CPU使用率超过阈值${CPU_THRESH}%" >> ${REPORT_FILE}
fi
if (( $(echo "${LOAD1} > ${LOAD_THRESH}" | bc -l) ));then
    echo "[警告] 系统负载过高" >> ${REPORT_FILE}
fi
echo "" >> ${REPORT_FILE}

# 2.内存
echo "===== 内存信息 =====" >> ${REPORT_FILE}
MEM_INFO=$(free -m)
MEM_TOTAL=$(echo "${MEM_INFO}" | awk '/^Mem/{print $2}')
MEM_USED=$(echo "${MEM_INFO}" | awk '/^Mem/{print $3}')
MEM_RATE=$(echo "scale=2; ${MEM_USED}*100/${MEM_TOTAL}" | bc)
echo "总内存: ${MEM_TOTAL}MB 已使用: ${MEM_USED}MB 使用率: ${MEM_RATE}%" >> ${REPORT_FILE}
if (( $(echo "${MEM_RATE} > ${MEM_THRESH}" | bc -l) ));then
    echo "[警告] 内存使用率超过阈值${MEM_THRESH}%" >> ${REPORT_FILE}
fi
echo "" >> ${REPORT_FILE}

# 3.磁盘使用率 + inode
echo "===== 磁盘信息 =====" >> ${REPORT_FILE}
df -h | grep -v tmpfs | grep -v loop >> ${REPORT_FILE}
echo "--- inode使用情况 ---" >> ${REPORT_FILE}
df -i | grep -v tmpfs | grep -v loop >> ${REPORT_FILE}
DISK_OVER=$(df -h | grep -v tmpfs | grep -v loop | awk '{gsub(/%/,"");if($5>'${DISK_THRESH}')print "[警告]分区 "$1"使用率:"$5"%"}')
if [ -n "${DISK_OVER}" ];then
    echo "${DISK_OVER}" >> ${REPORT_FILE}
fi
echo "" >> ${REPORT_FILE}

#4.进程&端口
echo "===== 进程TOP5(CPU) =====" >> ${REPORT_FILE}
ps -aux --sort=-pcpu | head -6 >> ${REPORT_FILE}
echo "" >> ${REPORT_FILE}
echo "===== 监听端口 =====" >> ${REPORT_FILE}
ss -tuln >> ${REPORT_FILE}

# 清理旧巡检报告
find ${LOG_BASE} -name "server_check_*.txt" -mtime +${RETENTION_DAY} -delete

echo "巡检任务执行完成: ${TIME}" >> ${LOG_BASE}/server_cron.log

赋权 + 测试

chmod +x /opt/scripts/server_check.sh
/opt/scripts/server_check.sh
# 查看报告
ls /opt/scripts/log/

crontab 配置(每天早上 8 点执行巡检)

crontab -e
# 添加
0 8 * * * /opt/scripts/server_check.sh >> /opt/scripts/log/server_cron.log 2>&1

本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/linux-server-inspection-shell-script

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/