Linux没有内建“当前会话连接时长”,需通过who或ps获取登录时间再与当前时间相减计算;uptime显示系统运行时间,非用户会话时长;TMOUT仅控制空闲超时,不记录已连接时间。

Linux 没有“当前会话连接时长”这个内建概念——系统不自动记录你这次 ssh 登录或本地终端打开后过了多久。所谓“会话时长”,得靠你自己算,或者依赖 shell 启动时间推断。
为什么 uptime 不是你要的会话时长
uptime 显示的是整个系统的连续运行时间,从上次 reboot 开始,和你本人什么时候登录完全无关。哪怕你刚连上服务器 2 分钟,uptime 也可能显示 up 42 days, 5:12。
常见误操作:看到终端里 uptime 输出的 up X days, Y:Z 就当成自己登录了多久 —— 这是错的。
- 它反映的是 kernel 运行时长,不是 login session 时长
- 多个用户同时在线时,
uptime对所有人一样 - 即使你登出再重登,
uptime值也不变
用 who 或 users 查当前登录时间(最常用)
who 命令输出每行包含用户名、终端、登录时间、远程地址(如有),第二列就是该会话的起始时刻:
who
输出示例:
alice pts/0 2026-07-07 18:23 (192.168.1.100)
这里 18:23 就是 alice 当前这个终端会话的登录时间。你可以手动计算与当前时间的差值。
-
who -u还会额外显示空闲秒数(idle time),但不显示总时长 -
users只列用户名,无法用于计算时长 - 本地图形终端(如 GNOME Terminal)通常显示
:0或tty1,登录时间仍可查
用 ps 算出 shell 进程存活秒数(适合脚本)
每个登录会话对应一个 shell 进程(如 bash、zsh),它的启动时间就是会话起点。用 ps 查 etimes 或 lstart:
ps -o lstart= -p $PPID 2>/dev/null | xargs
这条命令取父进程(即 login shell)的启动时间字符串;如果想直接得到已运行秒数:
ps -o etimes= -p $PPID 2>/dev/null | xargs
注意:$PPID 是当前 shell 的父进程 PID,在大多数交互式终端中就是登录 shell;但在 screen、tmux 或 systemd-user session 下可能不准。
- 非 root 用户也能执行,无需特权
-
etimes是整数秒,精度足够日常判断 - 若返回空,说明
$PPID不是预期的 login 进程(比如你在docker exec里运行)
别指望 TMOUT 能告诉你已连接多久
TMOUT 是空闲超时阈值(单位秒),不是计时器。它只控制“多久没输入就自动退出”,本身不记录已运行时间。
执行 echo $TMOUT 只能看到设置值(比如 300 表示 5 分钟无操作断开),不能反推“我已连了 4 分 23 秒”。
- 即使
TMOUT未设,shell 也不会自动维护会话时长变量 - 有些发行版默认不启用
TMOUT,输出为空 - 它只影响交互式 shell,对
ssh -t command类非交互会话无效
真正可靠的会话时长,永远来自两个时间点相减:登录时刻(who 或 ps -o lstart)和当前时刻(date)。没有一键命令能绕过这个计算逻辑——因为 Linux 本身就不存这个值。


















