服务器健康巡检(轻量版)+ 客户版报告
一、适用场景
- 节前 / 假期前给客户的服务器巡检报告,基调是"系统正常 + 附证据"
- 单台或多台(多台出统一汇总报告)
- 目标机:CentOS 6.x(sysvinit)~ CentOS 7+/8、TencentOS 等 systemd 系
二、巡检脚本
位置:scripts/linux_health_check_lite.sh(本技能目录内,权威版本)
历史副本另存于 ~/Downloads/server-health-check-lite/,两份不一致时以技能目录内为准。
特性:单文件 bash、约 185 行、全程只读(不装包不改配置)、命令缺失自动跳过、set -u 安全。
覆盖 8 模块:系统概览 / CPU / 内存 / 磁盘(空间+inode+只读挂载) / 网络(错包+连接数+端口) / 进程(僵尸/D状态) / 关键服务(sshd/crond/rsyslog/ntpd) / SSH安全+时间同步。
服务器端执行步骤(发给客户或自己在目标机跑):
# 1) 上传(scp 或粘贴后去 CRLF)
scp linux_health_check_lite.sh root@服务器IP:/tmp/
sed -i 's/\r$//' /tmp/linux_health_check_lite.sh # Windows 上传才需要
# 2) 执行(root 最全)
bash /tmp/linux_health_check_lite.sh
# 3) 取回结果(落盘为 /tmp/health_<主机名>_<时间戳>.txt)
scp root@服务器IP:/tmp/health_*.txt .
脚本已知坑(已修复,勿回退):
- ntpd 未运行时曾同时误报"运行但未同步"——已修,逻辑为:先查进程在不在,再查同步状态。
三、客户版报告生成(核心风格约定 ⚠️)
报告基调(2026-08-31 确认,多轮迭代):
- 尽量都体现正常项目——CPU/内存/磁盘/网络/进程/服务每台逐条打勾列出,给客户安心。
- 只有严重问题(CRIT)才显眼提示;WARN/INFO 一律压成灰色"备注"小字,不列为风险项、不进彩色风险表。
- 默认剔除项(不作为风险展示,除非用户当次另有指示):
- ntpd 时间同步未运行(2026-08-31 明确:客户报告中去掉)
- SSH 允许 root 直登 / 密码认证(不重要)
- 长时间未重启 → 改写为 "已正常运行 N 天(OK)",精确到天,算正常项 - 结论先写"系统整体运行正常",再列证据清单。
- 无任何展示风险项时评分给 96/100 优秀(A);有 1 项 CRIT 时给 88/100 良好(A)。
- 灰色备注保留(供内部参考):节点命名核对、CentOS 6 EOL、TIME_WAIT 偏高、DB 观察项——不进风险表。
四、报告结构(HTML 模板)
模板:templates/report_template.html(5 台汇总报告定稿版,已做脱敏处理,占位符:XX集团 / SRV-APP-1 等 / 10.0.x.x)
header :客户名 + 巡检日期 + 覆盖节点 + 评分环形图 + 健康等级
KPI 卡片 :全部绿色 OK(在线数 / 需处理0 / 僵尸0 / 错包0)
一、巡检结论:先讲正常 + OK 证据清单(打勾列表)
二、服务器总览:表格(标识/IP/主机名/系统/CPU/内存/磁盘/状态→全"正常"绿标)
三、各服务器明细:每台一个卡片,头部主机名+IP+系统+已正常运行N天+配置,
正文 6 条打勾正常项(CPU/内存/磁盘/网络/进程/关键服务)
四、备注(非紧急,节后可择机处理):灰色小字 ol 列表
footer :数据来源 + 生成时间
单机报告结构类似,去掉总览表、只保留单节点卡片。
多台汇总时注意:核对主机名与用户给的 IP/标签对应关系(曾出现 app3/app4 主机名与直觉命名相反的情况,要在备注中提示核对,但不当风险)。
五、产出路径
- 输出目录:当前会话工作区
- HTML:
<工作区>/health_<客户或主机>_<YYYYMMDD>_report.html - PDF:同名
.pdf,供发客户
六、HTML → PDF 转换(macOS)
使用技能内置脚本 scripts/html2pdf.sh,自动探测 Chrome / Edge / Chromium:
bash scripts/html2pdf.sh <input.html> [output.pdf] # 省略 output.pdf 时输出同名 .pdf
已知坑(脚本已内置规避,勿改回裸命令):
- 无头打印完成后浏览器进程常常不自行退出,裸调会把 shell 挂死;脚本采用后台启动 + 轮询产物 + 到手即杀
- 必须加 --user-data-dir 隔离 profile,否则与已运行的浏览器实例抢锁
- 旧版 Chrome 不支持 --no-pdf-header-footer,脚本会自动退回默认打印重试
验证:转完后先确认文件存在,再用 pypdf 抽文本核对内容:
from pypdf import PdfReader
r = PdfReader("/abs/path/report.pdf")
txt = "\n".join((p.extract_text() or "") for p in r.pages)
# 核对:页数、"正常"在、需剔除项(如 ntpd)不在
七、流程总结(下次直接照做)
- 把
scripts/linux_health_check_lite.sh给到目标服务器执行(或客户自己跑完发回 txt) - 读 txt,提取:主机名/IP/系统/运行天数/CPU/内存/磁盘/网络/进程/服务状态
- 套
templates/report_template.html生成客户版 HTML(风格约定见第三节) bash scripts/html2pdf.sh转 PDF,pypdf 验证内容- present_files 交付 HTML + PDF