Linux 多机监控统一管理方法

7次阅读

ssh + tmux 可实时并行监控多台服务器负载,关键在于启用 synchronize-panes 后统一发送 watch -n 2 ‘uptime; free -h | grep mem’;rsyslog 需显式加载 imudp 模块并开放 udp 514 端口;ansible 用 service 模块查状态更简洁可靠;prometheus 抓取失败多因 dns、监听地址、metrics_path 或时间不同步。

Linux 多机监控统一管理方法

ssh + tmux 实时并行看多台机器负载

想一眼看清 5 台服务器的 CPU、内存、磁盘,又不想挨个开终端切来切去?tmux 的同步发送功能比写脚本更快上手,也比 Web 界面更轻量。

常见错误是直接在 tmux 里用 ssh 连完就手动输命令,结果窗口一多就不同步。正确做法是先启用同步输入,再批量发监控命令:

  • 启动新会话:tmux new-session -s monitor
  • 水平分屏连三台:tmux split-window -h 'ssh user@host1',重复两次改 host2/host3
  • Ctrl-b :set synchronize-panes on(注意空格和冒号)
  • 任意窗格里敲 watch -n 2 'uptime; free -h | grep Mem',所有窗格同时执行

注意:synchronize-panes 是会话级开关,断开重连后失效;如果某台机器 SSH 超时,对应窗格会卡住,建议提前配置好 ~/.ssh/configServerAliveInterval 30

rsyslog 集中收集日志但收不到远程消息?检查这三点

不是配置写了就能收,rsyslog 默认不监听 UDP/TCP 端口,且新版(v8.20+)默认禁用传统模块。

典型现象:客户端用 logger 发日志,服务端 /var/log/syslog 里完全没记录,netstat -tuln | grep 514 也没监听。

  • 确认加载了网络模块:检查 /etc/rsyslog.conf/etc/rsyslog.d/50-default.conf 是否有 module(load="imudp")input(type="imudp" port="514")
  • 防火墙必须放行 UDP 514(TCP 514 少用,容易丢包):sudo ufw allow 514/udp
  • 客户端需显式指定目标:logger -n syslog-server-ip -P 514 "test",否则走本地 socket

性能影响:UDP 日志无确认机制,高并发下可能丢,但对告警类日志够用;若要可靠传输,得换 relp 模块,但部署复杂度翻倍。

ansible 批量查服务状态比写 for 循环干净在哪

不用登录每台机器敲 systemctl is-active nginx,也不用拼接 ssh 命令加错误判断——ansible 的幂等性和返回结构天然适配状态检查。

场景:巡检 20 台机器的 nginxredis 是否 running,出问题立刻标出 IP。

  • 写一个极简 playbook:check-services.yml,只用 service 模块,state: started 不会重启,只查状态
  • 执行:ansible all -i hosts.ini -m service -a "name=nginx state=started" --one-line,失败的行自带红色标记
  • 关键参数:--one-line 避免输出冗余,-o 更紧凑;加 --limit host1,host2 可临时跳过异常节点

兼容性注意:centos 7 用 systemdubuntu 22.04 同样支持,但 Alpine linux 默认没 systemd,得换 command 模块调 ps

prometheus + node_exporter 多机指标拉取失败的典型原因

不是端口通了就能采集,prometheus 抓取失败常卡在 DNS、TLS、路径三处,错误信息藏在 Status → Targets 页面里,不是日志。

现象:node_exporter 在本机能 curl 通,但 Prometheus 显示 context deadline exceededserver returned http status 404 Not Found

  • DNS 解析失败:Prometheus 配置里写 targets: ['host1:9100'],但宿主机 /etc/hosts 没映射,或容器网络不通;建议全用 IP,避开 DNS
  • node_exporter 启动参数漏了 --web.listen-address=:9100(默认只监听 127.0.0.1)
  • Prometheus 的 scrape_configsmetrics_path 错写成 /metrics/(多了一个斜杠),实际是 /metrics

容易被忽略的是时间同步:如果某台机器时间快 3 分钟,Prometheus 会拒绝其指标(TS 不在容忍窗口内),ntpq -pdate 更准。

text=ZqhQzanResources