用脚本实现快捷系统诊断

wen 实用脚本 2

提升运维效率的实战指南

目录导读


为什么要用脚本实现快捷系统诊断?

在日常运维中,系统故障往往伴随着多维度指标异常:CPU飙升、内存泄漏、磁盘IO阻塞、网络延迟……传统的人工排查方式效率极低,尤其是在服务器集群或云原生环境下。用脚本实现快捷系统诊断,可以解决以下痛点:

用脚本实现快捷系统诊断

  • 缩短MTTR(平均修复时间):脚本能在30秒内采集CPU、内存、磁盘、网络等关键信息,并自动输出异常标记。
  • 标准化诊断流程:避免不同工程师的排查差异,确保每次诊断都覆盖核心指标。
  • 支持非工作时间自愈:结合cron定时任务,脚本可自动触发告警并尝试恢复。

小问答:脚本诊断能替代专业监控工具吗?
不能,但脚本是监控系统的“急救补充”,当Zabbix、Prometheus等平台无法覆盖突发场景(如SSH断连后本地排查)时,一个轻量级诊断脚本往往是最快的突破口。


核心脚本设计思路与常用工具

1 设计原则

  • 原子化:每个检查函数只做一件事,便于组合和复用。
  • 自包含:脚本不依赖外部文件,所有输出实时打印到终端或日志。
  • 结果可解析:使用JSON或键值对格式输出,方便接入告警系统。

2 常用命令行工具(Linux环境)

检查项 核心命令 指标解析
CPU top -bn1 \| head -5 user/sys/idle占比
内存 free -m 可用内存、Swap使用率
磁盘 df -h 分区使用率、inode耗尽警告
网络 ss -tlnp 监听端口、连接数、丢包率
进程 ps aux --sort=-%mem 最高内存/CPU占用进程

实战案例:一个通用系统诊断脚本

以下是一个可复制使用的Bash脚本片段,涵盖常见诊断项,且加入了颜色高亮和异常阈值告警:

#!/bin/bash
# 快速系统诊断脚本 v2.1
# 使用方法: bash sys_diag.sh
echo "===== 系统诊断开始: $(date) ====="
# 1. CPU负载检查
CPU_LOAD=$(top -bn1 | grep "load average" | awk '{print $10 $11 $12}')
echo -e "[CPU] 最近1/5/15分钟负载: $CPU_LOAD"
if (( $(echo "$(awk '{print $1}' /proc/loadavg) > 0.8" | bc -l) )); then
    echo -e "\033[31m[警告] CPU负载过高!\033[0m"
fi
# 2. 内存使用率
MEM_TOTAL=$(free -m | grep "Mem:" | awk '{print $2}')
MEM_USED=$(free -m | grep "Mem:" | awk '{print $3}')
MEM_PERCENT=$(echo "scale=2; $MEM_USED*100/$MEM_TOTAL" | bc)
echo -e "[内存] 已使用: $MEM_PERCENT%"
# 3. 磁盘使用率(检查根分区)
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 80 ]; then
    echo -e "\033[31m[警告] 根分区使用率已达 $DISK_USAGE%!\033[0m"
fi
# 4. 网络连接数
CONN_COUNT=$(ss -tlnp | grep -c "LISTEN")
echo -e "[网络] 当前监听端口数: $CONN_COUNT"
# 5. 僵尸进程检查
ZOMBIE=$(ps aux | awk '{if ($8=="Z") print}' | wc -l)
if [ "$ZOMBIE" -gt 0 ]; then
    echo -e "\033[31m[警告] 发现 $ZOMBIE 个僵尸进程!\033[0m"
fi
echo "===== 诊断结束 ====="

扩展建议:可将脚本结果通过mailxcurl发送到企业微信机器人,实现自动告警。


FAQ:脚本诊断常见问题解答

Q1:脚本诊断速度很慢,如何优化?
A:避免在单次诊断中重复运行多个耗时的命令。ps auxtop可合并为一次采集,使用/proc伪文件系统直接读取数据比命令解析快5倍以上。

Q2:Windows环境下如何进行脚本诊断?
A:Windows Server推荐使用PowerShell脚本。Get-Process | Sort-Object CPU -Descending | Select -First 5,同时可利用WMI查询磁盘、内存状态。

Q3:脚本诊断结果如何持久化?
A:在脚本开头添加LOGFILE="/var/log/sys_diag_$(date +%Y%m%d).log",并在每个诊断步骤后执行echo "指标:值" >> $LOGFILE,建议保留7天日志后自动清理。

Q4:如何避免脚本诊断造成系统负载?
A:添加执行超时保护,例如timeout 10 bash sys_diag.sh,在高负载服务器上建议使用nice -n 19降低脚本优先级。


最佳实践与安全建议

  1. 权限控制:诊断脚本不应要求root权限(除非需采集内核级数据),建议以普通用户运行,并通过sudoers白名单开放特定命令。
  2. 敏感信息脱敏:脚本输出中不要包含明文密码、密钥路径,网络诊断时,ss -tlnp显示的程序路径可能暴露敏感信息,建议用grep -v过滤。
  3. 跨平台兼容:在脚本开头用uname -s判断操作系统类型,分别执行Linux或Unix命令。
  4. 持续集成:将脚本纳入CI/CD流水线,每次部署后自动运行诊断并对比基线,快速发现性能退化。

用脚本实现快捷系统诊断的精髓在于:轻量、快速、可重复,它虽然无法替代商业级APM工具,却是每个运维工程师必备的“瑞士军刀”,从今天开始,只需10分钟编写这个脚本,下一次故障排查将变得高效而从容。

抱歉,评论功能暂时关闭!