w命令第一行末尾的“users”数字最省事,但仅统计有终端的活跃会话数,不等于不同用户数,也不含无终端gui会话;需按需求选who、w或loginctl。

直接看 w 命令第一行末尾的 “users” 数字最省事,但这个数不等于“不同用户数”,也不包含无终端的 GUI 会话——得按实际需求选工具。
用 w 或 who 统计带终端的活跃会话数
这两个命令都读取 /var/run/utmp,只统计有分配 TTY 的登录(比如 SSH、本地 tty、X11 pts),不包括纯后台服务或未分配终端的 systemd 用户会话。
-
w -h | wc -l:去掉表头后统计行数,结果和who | wc -l一致,适合脚本中快速取整数 - 同一用户开多个 SSH 连接 → 算多个会话;用
screen或tmux开多窗口 → 仍只算一个会话(共用同一个 pts) -
who -u可附加显示空闲时长和 PID,方便识别挂起的僵尸会话 - 某些容器或 minimal 系统可能没启用 utmp 记录,
who返回为空不是命令坏了,是压根没写日志
用 loginctl 获取完整会话视图(systemd 系统必备)
Ubuntu 22.04+、CentOS 8+、Fedora 等现代发行版默认用 systemd,loginctl 才是权威来源,能捕获 Wayland/X11 图形会话、SSH、console,甚至 machinectl 启动的容器会话。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 当前所有会话数:
loginctl list-sessions --no-legend | wc -l - 去重后的不同用户数:
loginctl list-users --no-legend | wc -l(这才是真正“多少人在用”的答案) - 如果报错
Failed to connect to bus,先确认是否为 systemd 系统;再试sudo loginctl …,但注意 root 会话是否应计入业务统计
别用 ps aux | grep sshd 估算在线人数
这个做法常见但危险:每个 sshd: 进程不一定对应一个用户(例如连接未完成、子进程残留、反向隧道等),且完全漏掉本地登录和图形用户。
-
w | grep pts | wc -l看 SSH 用户更靠谱,但它仍依赖 pts 分配,不适用于禁用 pts 的环境(如某些容器或自定义 PAM 配置) -
last | grep "still logged in" | wc -l理论上可补全,但依赖/var/log/wtmp写入完整性,重启频繁或日志轮转异常时容易漏记
真正难处理的是混合登录场景:比如一个用户既在本地图形界面登录,又开了两个 SSH,还连着一个 tmux 会话。这时候 who 和 w 都报 3,loginctl list-sessions 报 4,loginctl list-users 才报 1。到底要“会话数”还是“人头数”,得先想清楚监控目标——工具只是手段,口径才是关键。










