核心是统一采集、标准化输出、差异聚焦:用systemctl/docker/kubectl固定字段和制表符分隔并排序,批量ssh拉取存档,再用diff/awk定位不一致项,最终封装为纯bash小工具实现一键比对与异常高亮。

直接用脚本批量比对集群各节点服务状态,核心是统一采集、标准化输出、差异聚焦。重点不在写多复杂的脚本,而在让每台机器返回的字段一致、可排序、易 diff。
统一采集命令:让输出结构可控
避免用 ps aux | grep 这类易受干扰的命令。推荐用 systemctl 或容器运行时原生命令,强制指定字段和格式:
- 查 systemd 服务:`systemctl list-units --type=service --state=active,failed --no-pager --no-legend | awk '{print $1,$4}' | sort`
- 查 Docker 容器:`docker ps --format "{{.Names}}\t{{.Status}}" | sort`
- 查 Kubernetes Pod(限定命名空间):`kubectl get pods -n default -o wide --no-headers | awk '{print $1,$3,$7}' | sort`
关键点:固定列数、用制表符分隔、排序后输出,为后续 diff 打好基础。
批量拉取并本地归档
用 for 循环或 parallel 调用 ssh,把每台节点的采集结果存成独立文件:
- 简单循环示例:for node in node1 node2 node3; do ssh "$node" 'systemctl list-units ...' > "$node".status; done
- 更稳的做法:加超时和错误跳过,比如用 timeout 10 ssh -o ConnectTimeout=5 "$node" ... || echo "$node: unreachable" >> errors.log
- 建议在本地建目录存放所有 *.status 文件,方便集中处理
一键对比差异:聚焦不一致项
不用肉眼翻文件。用 comm、diff 或简单 awk 就能定位异常:
- 两两对比(如 node1 vs node2):diff node1.status node2.status
- 找所有节点都缺失的服务:awk '{print $1}' *.status | sort | uniq -c | awk '$1 != 3 {print $2}'(假设有3个节点)
- 快速标出状态异常行:grep -E "(failed|Exit|unhealthy)" *.status
输出结果里只保留服务名、状态、所在节点,信息够用不冗余。
封装成小工具:一次执行全搞定
把上面几步写成一个可复用的 shell 脚本,支持传入节点列表和检查类型:
- 脚本开头定义变量:NODES=("node1" "node2" "node3"); CHECK_TYPE="systemd"
- 根据 CHECK_TYPE 自动选择采集命令,自动拉取、自动比对、自动高亮 failed/unhealthy 行
- 最后汇总成简明报告,例如:[FAIL] nginx.service on node2 (inactive)
不需要依赖 Python 或数据库,纯 bash + 标准工具,部署零成本,运维现场随时跑。











