监控条与信息面板:不用敲 top 也能盯住服务器
你正盯着一场部署。日志已经四十秒没动了,你想知道为什么:是内存不够了,磁盘满了,网络成了瓶颈,还是它本来就慢?要得到诚实的答案,得付出一次上下文切换的代价。htop——看一眼——q。然后 df -h。然后 uptime。三条命令,其中一条还是全屏 TUI,会直接占掉你正在读的那个窗格。
electerm 把这个答案放进了界面框架里,而不是你的回滚缓冲里。页脚上方 28 像素高的一条监控条,会复用你已经打开的那条 SSH 连接每隔几秒采样一次机器状态;而当这一条不够用时,右侧的信息面板会把同一台机器完整地铺开给你。
两个入口,同一台机器
这两个界面读的是同一份数据、由同一个监控器产出、挂在同一个会话上。区别只在于它们显示多少,以及把它放在哪里。
| 监控条 | 信息面板 | |
|---|---|---|
| 位置 | 页脚上方 28px,横跨终端区 | 右侧栏,500px(可停靠) |
| 打开方式 | 设置 → 终端 → 监控条 | 页脚上的图表图标 |
| 适用会话 | 仅 SSH | 任意会话,包括本地终端 |
| 形态 | 九项扫一眼就懂的数据 | 完整表格,分区可自选 |
| 打开时 | —— | 监控条隐藏,避免同一份数据出现两次 |
开启监控条
设置 → 终端 → 监控条。它默认是关闭的,而且是刻意的:这条监控条会每隔几秒在远端主机上执行命令,electerm 不会去轮询一台你还没让它轮询的服务器。
打开之后,SSH 标签页就会多出一条像"关于这台主机的一句话"的横条:
web-01 CPU 37% ⣀⣠⣠⣀ Mem 3.2 GiB / 15.6 GiB ↑ 1.2 MiB/s ↓ 4.6 MiB/s Up 12d 06h zxd +2 /:43% /home:18% /var:91%
依次是主机名、当前 CPU 负载、五分钟 CPU 历史画成的迷你折线、已用内存与总内存、主网卡的上传与下载速率、运行时间、登录用户,以及前三个文件系统的使用率。全部都不用离开当前窗格。
每一项的代价
监控条是一组小的 POSIX shell 探测命令,而不是需要你安装的 agent。可能会被执行的命令,完整清单如下:
| 项 | 显示 | 刷新 | 在服务器上跑什么 |
|---|---|---|---|
| hostname | web-01 |
一次 | uname -s -n -r -m + 从 /etc/os-release 取 PRETTY_NAME= |
| cpu | CPU 37% |
5 秒 | 两次 grep '^cpu ' /proc/stat,间隔 100ms |
| cpuHistory | 迷你折线 | 5 秒 | 同一次采样,留存为历史 |
| memory | Mem 3.2 GiB / 15.6 GiB |
5 秒 | cat /proc/meminfo |
| upload | ↑ 1.2 MiB/s |
5 秒 | /sys/class/net/* 的 tx_bytes |
| download | ↓ 4.6 MiB/s |
5 秒 | 同一组探测里的 rx_bytes |
| uptime | Up 12d 06h |
5 秒 | cat /proc/uptime |
| users | zxd +2 |
30 秒 | who |
| disks | /:43% /home:18% |
10 秒 | df -Pk |
注意这些间隔:CPU、内存、网络和运行时间一直在变,所以每五秒读一次;磁盘表每十秒;登录用户每三十秒;而内核与系统字符串每个会话只读一次——因为在同一个会话运行期间它们根本不会变。这也正是它便宜的原因:它的全部意义就在于它不是一套监控守护进程。
不需要它们的时候,它们不在
把鼠标扫到监控条上,右侧会淡入两个控件:一个筛选(挑出你需要的那几项),一个关闭按钮——效果和设置里的开关完全一样。鼠标移开,它们就消失了,这样这条横条才像一条横条。
触屏设备没有 hover,所以那两个控件就直接常驻。同一个思路,不同的输入方式。
绿、黄、红——带一个死区
数值会按级别配色,而且每个磁盘挂载点各有自己的级别:
| 级别现在是 | 回到正常 | 警告 | 危险 |
|---|---|---|---|
| 正常 | — | ≥ 80% | ≥ 90% |
| 警告 | < 75% | 75–89% | ≥ 90% |
| 危险 | < 80% | 80–84% | ≥ 85% |
这个不对称才是真正有意思的地方。用最直白的阈值,负载在 80% 附近抖动时颜色就会来回翻转——一条在你阅读时不停在白色和琥珀色之间闪的横条,比没有横条更糟。所以回落时会留出五个点的余量:一旦进入 warning,只有低于 75% 才会回到正常;一旦进入 critical,要等负载真的降下来(低于 85%)才会解除。
警告或危险的项目,数值前面还会多出一个小三角,所以当你的目光并不在角落里时,一个红色的 /:91% 依然能抓住你。
点开任意一项,看真正的答案
鼠标悬停会打开弹层;点一下则把弹层钉住,这样读的时候不必保持鼠标不动。按 Escape 关闭。弹层里面的内容,才是监控条从"扫一眼"变成"工具"的地方。
cpu —— 最近五分钟的当前值、平均值、最小值和最大值,画成 360×88 的折线图,后面跟着占用 CPU 最高的十个进程:PID、用户、CPU、内存,以及被截断的命令行。每一行都有终止按钮,于是"是哪个失控进程在吃机器,停掉它"就只是一次弹层操作,不需要 htop。
memory —— 已用及其占比、可用、总量,以及 swap 的已用与总量。如果内核老于 MemAvailable(3.14),数字会退回 MemFree,同时弹层会明确标出 compatibility memory,而不是悄悄给你一个更差的数字。
upload / download —— 一张按网卡展开的表:名称、IPv4 地址、当前速率,以及开机以来的累计计数。持有默认路由的那张网卡会带一个 * 标记,因为监控条汇总的正是它。窗口够宽时还能看到发送/接收总量;窗口窄了,表格就只保留放得下的列。
uptime —— 开机了多久,以及换算成墙上时钟的开机时刻。后者往往才是你真正想知道的("它昨晚重启过吗?")。
users —— 每个登录会话一行:用户、TTY、登录时间,以及你从哪个地址登进来的。
disks —— 每个挂载点一行:百分比、已用、可用、总量和文件系统,百分比按上面的级别配色。
hostname —— 主机名、地址、系统、内核、架构,以及 shell 及其版本。
还有两个细节,让它在赶时间时特别好用:点击数值单元格即可复制(而已经完成的文本选区优先级高于点击,所以在单元格里拖选不会误伤你的剪贴板);每个弹层底部都有一个 info 按钮,把你交给信息面板。
信息面板:同一台机器,完整铺开
信息面板从终端页脚上的图表图标打开,而且是按会话的——切换标签页,它显示的就是那个标签页对应的机器,而不是一个全局看板。
默认形态是浮层:宽 500px,从窗口顶部栏下方开始,在页脚之上结束——因为页脚上放着的,正是用来开关它自己的那个图标。一个通高的浮层会把它自己的开关埋掉。把它钉住,它就变成停靠面板:终端被挤到一边,右侧整列从上到下都归它。
面板顶部是终端自身的信息,不是服务器的:
ID: 4f1c2a7e-...
[ ] save terminal log to file
[ ] addTimeStampToTermLog
terminal log path: ~/electerm-logs/web-01.log [reveal]
[分区筛选 ▾]
会话 ID、日志落盘开关、时间戳开关(只有在你开始写日志之后才会出现——给一份并不存在的日志加时间戳只是噪音)、解析好的日志路径和一个在文件管理器中定位它的按钮,以及分区筛选。
再往下,就是你选中的分区。无论你用什么样的顺序勾选它们,展示顺序永远一致——hostname 在最前,其余按固定顺序排开:
| 分区 | 内容 |
|---|---|
| hostname | 主机名、地址、系统、内核、架构、shell |
| uptime | 运行时间、开机时刻 |
| cpu | 当前 / 平均 / 最小 / 最大、折线图、进程排行 |
| mem | 已用、可用、总量、swap |
| activities | 完整进程表,可按 CPU 或内存排序 |
| network | 全部网卡、速率与累计量 |
| disks | 全部挂载点,而不只是前三个 |
| users | 全部登录会话 |
默认勾选的是 uptime、cpu、mem、activities、network、disks;users 需要你自己打开。如果你保存的配置里还留着旧版的 swap,它会被并入 mem,所以你永远不会看到同一组数字出现两次。
本地终端是另一套分区
本地 shell 也有操作系统,但在 macOS 和 Windows 上并没有 /proc 可读。所以对本地标签页来说,hostname 分区是在本地由应用自身解析的,不向任何地方发送 shell 命令:macOS 15.1、Windows 11 (10.0.22631)、Linux 6.8.0-45-generic,再加上主机名、内核、架构,以及所用 shell 及其版本(通过 <shell> --version 探测,Windows PowerShell 上则用 $PSVersionTable.PSVersion)。
本地拿不到的是那些指标——CPU、内存、磁盘。它们来自 Linux 主机上的 /proc 与 /sys,而那正是这个面板的用途。这也是监控条只支持 SSH 的原因:本机并没有一台机器可以被这样监控。
信息面板打开时,监控条会让位
在 SSH 标签页里打开信息面板,监控条就消失了。这不是 bug,也不是空间不够:这两个界面读的是同一个监控器,同时显示就是重复——而且面板的下边缘正好落在监控条那 28px 上,它会透出来。弹出对话框时监控条同样隐藏,免得去和对话框抢同一个角落。
关掉面板,横条就回来了,而且历史还在——CPU 迷你折线不会从头开始。
线上实际发生了什么
以上这一切都不会另开连接,也不会碰你的 shell:
- 每条探测都是在你已经建立的那条 SSH 连接上的一次独立 exec 请求。不会往交互式 shell 里输入任何东西,不会出现在回滚缓冲里,也不会进你的 shell 历史。
- 每条命令都有 5 秒超时。一个因 NFS 挂死而卡住的
df不可能把监控条拖住。 - 退出码
126/127,或者报not found的命令,会把该分区标记为不可用并停止轮询——这就是精简容器或老旧 busybox 的样子,而每五秒再去问一次是很不礼貌的。 - 其它错误会保留最后一次正确的值,并标上
stale和读取时刻,而不是冲你闪—。 - 连续失败会指数退避,最长到一分钟一次。
- 窗口不可见时轮询停止。 后台里挂着的 electerm 不是监控 agent;切走,命令就停。
- 每个会话只有一个监控器,监控条和信息面板共用它;最后一个观察者离开后五分钟,它才会被销毁。
- CPU 历史是最近 60 个采样——5 秒一次即五分钟——而迷你折线在采样缺失处会断开,所以一段 stale 期间永远不会被画成一条平滑的直线。
哪些数字可以放心信,哪些需要理解
CPU 是差值,不是读数。 /proc/stat 里只有开机以来的累计计数,所以 electerm 取间隔 100ms 的两次采样、算出变化量,并排除 idle 与 I/O wait。这就是为什么你连上去之后读到的第一个值是空的,而不是零。
内存用的是 MemAvailable,不是 MemFree。 MemFree 是"此刻没东西在用",而在一台健康的 Linux 上这个数字小得令人沮丧——page cache 也算已用。MemAvailable 是"内核认为这些内存要得回来",也就是你在判断机器是否有压力时真正想要的那个数。
网络速率同样是差值,而且复位的情况都被处理了。 第一次采样没有速率;默认网卡变化后的第一次采样也没有(VPN 起来了、容器网桥出现了);计数倒退之后的第一次同样没有——当你读的是字节计数时,重启就长这样。这三种情况下,监控条显示 —,而不是一个壮观且完全虚构的尖峰。
上传和下载只跟着一张网卡。 默认路由所在的那张网卡(ip route show default),而不是机器上所有网卡的总和。否则 docker 网桥和 VPN 隧道会在真实流量之上再被叠加一次。
磁盘会跳过伪文件系统。 tmpfs、devtmpfs、proc、cgroup、squashfs 之类都被过滤掉,而 overlay 只在挂载到 / 时保留——这正是你在容器里想要的。监控条按优先级排序(先 /,再 /home、/var、/data)后展示前三个挂载点,还有更多时显示 +N;面板则把它们全部列出。
一个为截图准备的开关
如果你要共享屏幕、直播,或者把面板粘进工单,打开 hide IP。它会一次性从 hostname 分区、网卡表和用户表里拿掉地址——这也是用户表里那列来源地址是被条件渲染、而非永久存在的原因。监控条本身从一开始就不显示任何地址。
找台忙碌的主机试试
监控条在一台真正干着活的机器上最有说服力。随便连一台,打开面板,然后在你跑一次构建或者一批 rsync 的时候把它放在那儿——你会看到这项工作的形状:CPU 往上爬,内存被填满,网络安静的时候磁盘在涨,然后一切放松下来。五分钟的历史,足以让你分辨"慢"和"在换页"。
同一个功能还有一个 65 秒的实录:electerm: 查看 SSH 服务器信息——内存、CPU、运行时间、进程、磁盘和网络,一次看完。
