1. 巡检脚本的价值与典型应用场景
在Linux系统管理和运维工作中,巡检脚本就像一位不知疲倦的24小时值班工程师。我曾在一次线上事故后发现,如果提前部署了磁盘空间检查脚本,完全可以避免服务中断。这种自动化检查工具的价值主要体现在三个方面:
首先是效率提升。手动逐台服务器检查CPU、内存、磁盘状态至少需要30分钟,而脚本可以在10秒内完成相同工作。其次是准确性保障。人工记录难免出错,脚本输出的数字永远精确到字节。最重要的是连续性监控,通过crontab设置定时任务,可以实现7×24小时无人值守巡检。
典型的应用场景包括:
- 基础设施健康度检查(CPU/内存/磁盘/网络)
- 关键服务进程存活监控
- 日志文件异常关键词扫描
- 定期安全审计(用户权限、SSH登录等)
- 业务指标采集(API响应时间、队列积压等)
提示:巡检频率需要平衡资源消耗和问题发现时效性。生产环境建议关键指标5分钟检查,次要指标每小时检查。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Shell巡检脚本的核心设计要素
2.1 基础检查模块实现
一个健壮的巡检脚本应该像瑞士军刀一样模块化。以下是内存检查的典型实现:
bash复制check_memory() {
local warn_threshold=80
local crit_threshold=90
# 获取内存使用率(兼容不同Linux发行版)
local mem_used=$(free | awk '/Mem/{printf "%.0f", $3/$2*100}')
if [ $mem_used -ge $crit_threshold ]; then
echo "[CRITICAL] Memory usage: ${mem_used}%"
return 2
elif [ $mem_used -ge $warn_threshold ]; then
echo "[WARNING] Memory usage: ${mem_used}%"
return 1
else
echo "[OK] Memory usage: ${mem_used}%"
return 0
fi
}
2.2 错误处理机制
在巡检过程中遇到错误时,合理的处理方式应该是:
bash复制# 设置错误继续执行(应对单点检查失败不影响整体巡检)
set +e
# 检查项执行示例
check_disk || echo "磁盘检查失败,跳过此项"
check_network || {
echo "网络检查严重错误!"
exit 1 # 严重错误立即终止
}
# 恢复严格错误检查
set -e
2.3 结果输出格式化
结构化输出便于后续处理:
bash复制generate_report() {
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
cat <<EOF
巡检报告
========
时间: $timestamp
主机: $(hostname)
---
内存状态: $memory_status
磁盘状态: $disk_status
服务状态: $service_status
EOF
}
3. 生产环境中的进阶技巧
3.1 性能数据采集与分析
使用awk进行实时统计计算:
bash复制# 计算CPU五分钟负载平均值
cpu_load=$(uptime | awk -F 'load average:' '{print $2}' | awk -F ',' '{print $2}')
# 磁盘IOPS统计
iops=$(iostat -d -x 1 2 | awk '/sd[a-z]/ {sum+=$7} END {print sum}')
3.2 告警集成方案
对接钉钉机器人示例:
bash复制send_dingtalk_alert() {
local message=$1
local webhook="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
curl -s "$webhook" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": {
"content": "'"$message"'"
}
}'
}
3.3 历史数据存储
简单的CSV日志记录:
bash复制log_metrics() {
local csv_file="/var/log/inspection_$(date +%Y%m%d).csv"
[ ! -f "$csv_file" ] && echo "timestamp,memory,disk,cpu" > "$csv_file"
echo "$(date +%s),$mem_used,$disk_used,$cpu_load" >> "$csv_file"
}
4. 常见问题排查手册
4.1 权限问题处理
bash复制# 检查脚本执行权限
[ -x "$0" ] || {
echo "错误:脚本没有执行权限"
chmod +x "$0"
exit 1
}
# 检查sudo权限
if [ "$EUID" -ne 0 ]; then
echo "警告:部分检查需要root权限"
fi
4.2 环境兼容性问题
处理不同Linux发行版的差异:
bash复制# 检测系统类型
if [ -f /etc/redhat-release ]; then
# CentOS/RHEL系统
pkg_manager="yum"
elif [ -f /etc/debian_version ]; then
# Debian/Ubuntu系统
pkg_manager="apt"
fi
# 根据系统类型执行对应命令
case $pkg_manager in
yum) service httpd status ;;
apt) systemctl status apache2 ;;
*) echo "未知系统类型" ;;
esac
4.3 脚本调试技巧
bash复制# 调试模式开关
DEBUG=false
# 调试输出函数
debug() {
$DEBUG && echo "[DEBUG] $1"
}
# 使用示例
debug "开始检查磁盘空间"
df -h | while read line; do
debug "处理行: $line"
done
5. 实战案例:服务器综合巡检脚本
以下是一个完整的生产级巡检脚本框架:
bash复制#!/bin/bash
# 服务器综合巡检脚本 v1.2
# 作者:运维老司机
# 最后更新:2023-07-20
# 全局配置
LOG_DIR="/var/log/inspection"
REPORT_FILE="${LOG_DIR}/report_$(date +%Y%m%d).log"
THRESHOLDS_CONF="/etc/inspection/thresholds.conf"
# 初始化环境
init_check() {
[ -d "$LOG_DIR" ] || mkdir -p "$LOG_DIR"
source "$THRESHOLDS_CONF" 2>/dev/null || {
echo "加载阈值配置失败,使用默认值"
MEM_WARN=80
MEM_CRIT=90
DISK_WARN=85
DISK_CRIT=95
}
}
# 主检查流程
run_checks() {
echo "=== 开始系统巡检 ==="
date
echo -e "\n[内存检查]"
check_memory
echo -e "\n[磁盘检查]"
check_disk
echo -e "\n[服务检查]"
check_services
echo -e "\n[安全检查]"
check_security
}
# 各检查项实现
check_memory() {
# 实现细节参考前文
}
check_disk() {
# 实现细节参考前文
}
# 主程序入口
main() {
init_check
run_checks | tee -a "$REPORT_FILE"
# 如有严重错误则发送告警
grep -q "CRITICAL" "$REPORT_FILE" && \
send_dingtalk_alert "发现严重问题!请查看巡检报告:$REPORT_FILE"
}
main "$@"
这个脚本框架在实际项目中可以扩展更多检查模块,比如:
- 数据库连接检查
- 证书过期检查
- 网络连通性测试
- 备份完整性验证
- 定时任务状态检查
每个模块都应该遵循相同的模式:定义阈值、执行检查、输出标准化结果。这种一致性使得脚本维护和结果解析都更加容易。
