uptime 命令详解与参数实测(Ubuntu 22.04)

uptime 命令逐参数实测详解:默认输出四段逐段解读(当前时间、up 时长、登录用户数、1/5/15 分钟平均负载)、-p 友好格式、-s 启动时间与 /proc/uptime 换算交叉验证,并以 2 个 yes 死循环实测负载爬升回落曲线与 CPU 核数相对判断,全部回显在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

uptime 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 uptime 的每一个参数——默认输出的逐段解读(当前时间、up 时长、登录用户数、load average)、-p 友好格式、-s 系统启动时间、-h/-V,并用 2 个 yes 死循环实测负载的爬升与回落曲线,给出 load average 与 CPU 核数的相对判断方法,全部命令与回显已在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • uptime 版本:procps-ng 3.3.17(uptime --version 实测)
  • uptime 属于 procps 软件包,Ubuntu 22.04 默认预装,无需额外安装
  • CPU 核数:12(nproc 实测,后文负载判断的基准)
  • 演示会话:本机通过 SSH 建立了 2 条演示登录会话(用户 u4a-ssh,终端 pts/4 与 pts/5,记录写入 /var/run/utmp),用于实测 uptime 用户计数与 who/w 的联动关系
  • 负载实验临时进程:2 个 yes 死循环(实验结束即 kill 清理,不留残留)

二、命令概览

2.1 语法与测试数据准备

uptime 的语法非常简单:uptime [options],不接收位置参数,只有 4 个选项(-p、-h、-s、-V)。它是服务器巡检中使用频率最高的单行命令:一条命令同时给出当前时间、开机时长、登录用户数、1/5/15 分钟平均负载四类信息。

uptime 的用户计数读取自 /var/run/utmp(登录会话数据库),负载读数读取自 /proc/loadavg,开机时长读取自 /proc/uptime。为实测用户计数的联动关系,本环境预先建立了 2 条真实 SSH 登录会话:

who | wc -l
2

为实测负载变化,后文用 yes > /dev/null & 制造 CPU 死循环(yes 是 coreutils 自带的字符输出工具,空转时占满 1 个 CPU 核心),并在关键时间点分段采样。

2.2 --help 全量输出

uptime -h 输出全部参数清单(实测原样保留,可作为参数速查):

uptime -h; echo rc=$?

Usage:
 uptime [options]

Options:
 -p, --pretty   show uptime in pretty format
 -h, --help     display this help and exit
 -s, --since    system up since
 -V, --version  output version information and exit

For more details see uptime(1).
rc=0

注意两点:其一,-h 输出帮助后退出码为 0(上面行内的 rc=0 实测);其二,help 输出第一行有一行空行,这是 procps-ng 帮助输出的固定格式,并非排版错误。

参数速查表:

参数长选项作用
-p--pretty以友好句式显示开机时长(up 8 hours)
-h--help显示帮助并退出
-s--since显示系统启动时刻(yyyy-mm-dd hh:mm:ss 格式)
-V--version显示版本信息并退出

关键差异:-p 与 -s 都围绕「开机时长/启动时刻」,-p 面向人读,-s 面向脚本比对;-h/-V 是所有 procps-ng 工具统一的辅助选项。

2.3 版本信息

uptime --version
uptime from procps-ng 3.3.17
uptime -V
uptime from procps-ng 3.3.17

--version 与 -V 输出一致:uptime from procps-ng 3.3.17。procps-ng 是 procps 的上游社区版,Ubuntu 22.04 仓库中的版本即 3.3.17。

三、参数逐项实测

3.1 默认输出(无参数)——逐段解读

先看最常用的无参数形态,同时执行 date 便于逐段对照:

uptime
 14:17:29 up  8:00,  2 users,  load average: 0.24, 0.43, 1.05
date
Thu Oct 15 14:17:29 UTC 2026

默认输出按空格可拆为四段,逐段解读如下:

字段实测值含义
第 1 段14:17:29当前系统时间,与 date 回显的时刻一致(精确到秒)
第 2 段up 8:00系统已连续运行 8 小时 0 分;不足 1 天用 时:分,超过 1 天会显示 up 3 days, 2:05 样式
第 3 段2 users当前登录用户会话数(读取 /var/run/utmp)
第 4 段load average: 0.24, 0.43, 1.051 分钟、5 分钟、15 分钟平均负载

💡 技术拓展:load average(平均负载)在不同系统上的统计口径并不相同,横向对比——

口径统计对象采样方式典型系统
Linux 口径可运行(R)+ 不可中断睡眠(D)的任务数指数加权移动平均,每 5 秒更新 1 次、按 1/5/15 分钟衰减Linux
经典 Unix 口径仅可运行(R)的任务数每 5 秒采样一次,同样做 1/5/15 分钟平均Solaris、传统 BSD

两者最大的差别是 Linux 把「等磁盘/等 IO 的 D 状态进程」也计入负载,因此 Linux 上 IO 瓶颈同样会推高 load average。本文实测环境为 Linux,采用第一种口径。

登录用户数与 who / w 的联动:uptime 的 users 计数与 who 列出的会话行数一致(都读 /var/run/utmp):

who
u4a-ssh  pts/4        Oct 15 14:16 (::1)
u4a-ssh  pts/5        Oct 15 14:16 (::1)
who | wc -l
2
w
 14:17:29 up  8:00,  2 users,  load average: 0.24, 0.43, 1.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
u4a-ssh  pts/4    ::1              14:16    1:09   0.00s  0.00s tail -f /dev/null
u4a-ssh  pts/5    ::1              14:16    1:09   0.00s  0.00s sleep 3600

w 的表头与 uptime 输出完全相同,只是在其下追加了每个会话的明细。三者(uptime、who、w)的用户计数在本实测中均为 2,口径一致。

load average 与 /proc/loadavg 的对照:uptime 的三个负载数字直接取自内核的 /proc/loadavg:

cat /proc/loadavg
0.24 0.43 1.05 1/2228 3241

前三个数与 uptime 完全一致;第 4 个字段 1/2228 表示「当前可运行实体数/调度实体总数」,第 5 个字段 3241 是最近创建的进程 PID(本次采样时正在创建演示进程)。uptime 只展示前三个字段。

3.2 -p(--pretty)友好格式

-p 把「开机时长」翻译成英文短句,适合告警通知、日志摘要等需要人直接阅读的场景:

uptime -p
up 8 hours

实测要点:

  • 时长不足 1 分钟时显示 up 0 minutes(刚启动的机器);
  • 超过 1 天时会带逗号,形如 up 3 days, 2 hours, 5 minutes;
  • -p 只输出时长本身,不含当前时间、用户数与负载,不能当作默认输出的替代品。

3.3 -s(--since)系统启动时间

-s 反推系统的启动时刻,输出 YYYY-MM-DD HH:MM:SS 格式:

uptime -s
2026-10-15 06:16:35

它的数据来源是 /proc/uptime(第一个字段是开机至今的秒数)。可以用 date 独立换算出启动时刻做交叉验证:

cat /proc/uptime
28855.32 258927.75
date -d "-$(cut -d. -f1 /proc/uptime) seconds" '+%F %T'
2026-10-15 06:16:34

换算结果 06:16:34 与 uptime -s 的 06:16:35 相差 1 秒:/proc/uptime 的 28855.32 在截断为整数秒后向下取整,而 uptime -s 输出的是按秒粒度取整后的启动时刻,二者在秒级粒度上是一致的。

/proc/uptime 第二个字段(258927.75)是所有核空闲时间的累计值(单位秒),多核机器上它会远大于第一个字段。

引导时刻还可以从 utmp 的引导记录中核对(last -f 直接读取 utmp 文件):

last -f /var/run/utmp | head -3
u4a-ssh  pts/5        ::1              Thu Oct 15 14:16   still logged in
u4a-ssh  pts/4        ::1              Thu Oct 15 14:16   still logged in
reboot   system boot  0.0.0.0          Thu Oct 15 06:16   still running

reboot system boot Thu Oct 15 06:16 与 uptime -s 的 06:16:35 一致。

而通常用来查引导时间的 who -b 在本环境无输出:

who -b
(无输出)

原因:who -b 依赖 utmp 中的 BOOT_TIME 引导记录,该记录由系统的引导管理进程在开机时写入;本环境开机时未写入该记录(last -f 看到的引导记录来自同一文件的实测核对),因此为空。真实服务器上 who -b 会输出 system boot 2026-10-15 06:16 样式的结果。

3.4 -h(--help)与退出码

-h 等价于 --help,输出帮助并正常退出(见 2.2,rc=0)。与其他 procps-ng 工具一致,把 -h 写进脚本判断参数合法性是安全的:命令不存在参数时返回非 0,而 -h 返回 0。

3.5 -V(--version)版本信息

-V 是 --version 的短选项(见 2.3),巡检脚本中通常用 -V 拿版本号做兼容性判断。

四、实战示例

4.1 一行巡检:时间、负载、核数一次拿齐

uptime && nproc
 14:17:29 up  8:00,  2 users,  load average: 0.24, 0.43, 1.05
12

巡检时先记下核数,再用负载除以核数判断繁忙程度(本例 0.24/12 ≈ 2%,非常空闲)。

4.2 负载爬升与回落曲线实证(2 个 yes 死循环)

起 2 个 yes > /dev/null & 死循环(每个占满 1 个核),然后在 T+0 / T+30s / T+65s / T+125s 分段采样 uptime,观察三个负载值的爬升速度差异。

启动死循环并确认进程状态($! 记录刚启动的后台进程 PID):

echo "-- 启动第 1 个 yes 死循环 --"; yes > /dev/null & echo "yes 进程 1 PID=$!"
echo "-- 启动第 2 个 yes 死循环 --"; yes > /dev/null & echo "yes 进程 2 PID=$!"
nproc
-- 启动第 1 个 yes 死循环 --
yes 进程 1 PID=3250
-- 启动第 2 个 yes 死循环 --
yes 进程 2 PID=3251
12
ps -o pid,comm,stat -p 3250,3251
    PID COMMAND         STAT
   3250 yes             R
   3251 yes             R

两个 yes 均处于 R(可运行)状态。分段采样结果如下:

date '+%T'; uptime
14:17:30
 14:17:30 up  8:00,  2 users,  load average: 0.24, 0.43, 1.05

T+0s:1 分钟值 0.24(死循环刚起,EMA 还没反应)。

date '+%T'; uptime
14:18:00
 14:18:00 up  8:01,  2 users,  load average: 1.77, 0.77, 1.14

T+30s:1 分钟值跳到 1.77;5 分钟值 0.77 刚开始抬头;15 分钟值 1.05 几乎不动。

date '+%T'; uptime
14:18:35
 14:18:35 up  8:02,  2 users,  load average: 2.20, 0.99, 1.20

T+65s:1 分钟值 2.20,逼近理论稳态(2 个满负荷死循环 ≈ +2.0)。

date '+%T'; uptime
14:19:35
 14:19:35 up  8:03,  2 users,  load average: 2.23, 1.23, 1.28
2.23 1.23 1.28 3/2253 3274

T+125s:1 分钟值稳定在 2.23;5 分钟值爬到 1.23;15 分钟值仅 1.28。三个窗口的时间常数差异一目了然:1 分钟值反应最快,15 分钟值最迟钝。

终止死循环(用 ps 复查这两个 PID,只剩表头无数据行,证明进程已终止):

kill 3250 3251; ps -p 3250 -o pid,comm; ps -p 3251 -o pid,comm
    PID COMMAND
    PID COMMAND
date '+%T'; uptime
14:21:07
 14:21:07 up  8:04,  2 users,  load average: 1.00, 1.06, 1.21

T+90s(kill 后):1 分钟值已回落到 1.00。实验不留残留进程。

4.3 load average 与 CPU 核数的相对判断

负载高低必须相对核数判断:本机 nproc = 12,负载 2.23 仅占约 19% 的总算力,完全不必紧张;若换成 2 核机器,同样的 2.23 已经饱和。判断口诀:

  • 负载持续 < 核数:健康;
  • 负载 ≈ 核数:满负荷运行,需关注趋势;
  • 负载持续 > 核数:有过载排队,结合 CPU 列(us/sy/wa)判断是计算瓶颈还是 IO 等待。

4.4 uptime / who / w / /proc/loadavg 四方一致性校验

排障时怀疑计数不准,可用一条命令串行核对四个来源(回显见 3.1):uptime 的 users = who | wc -l = w 表头 users,uptime 的三个负载数 = cat /proc/loadavg 前三个字段。本实测四方数据完全一致。

4.5 判断「这台机器最近重启过吗」

-p 与 -s 组合,一句拿到「跑了多久 + 什么时候开机」:

uptime -p && uptime -s
up 8 hours
2026-10-15 06:16:35

若巡检脚本发现 uptime -s 的日期比预期新,说明近期发生过重启,可再结合系统日志排查重启原因。

五、注意事项与常见问题

Q1:load average 多少算高? 没有绝对标准,必须相对 CPU 核数:负载持续高于核数才算过载(如 12 核机器负载 15 才需要警惕;2 核机器负载 2.5 就已经排队)。同时注意 Linux 口径把 D 状态(等 IO)也计入,load 高不一定是 CPU 忙,也可能是磁盘瓶颈——需结合 vmstat 的 wa 列进一步区分。

Q2:uptime 的 users 和 who 数出的数量对不上? 两者读的都是 /var/run/utmp,正常一致。出现不一致通常是 utmp 里有残留的异常记录(例如上次异常退出遗留的会话、被手工改写过的记录)。本组实测中就出现过:utmp 中存在残留脏记录时 uptime 显示 4 users 而 who 为空;清理残留并重建规范 SSH 登录会话后,二者恢复一致(2 users ↔ 2 行)。生产上若怀疑 utmp 损坏,可用 utmpdump /var/run/utmp 检查记录内容。

Q3:who -b 没有输出怎么办? 说明 utmp 中没有 BOOT_TIME 引导记录(本实测环境即如此)。替代方案:uptime -s(内核数据反推)、last -f /var/run/utmp(读引导记录)、cat /proc/uptime(换算)。三者交叉核对(见 3.3)。

Q4:为什么 1 分钟负载还没到「1 个满负荷任务=1.0」的稳态? load average 是指数加权移动平均,需要约 1 分钟才能逼近稳态值(实测 T+65s 时 2 个死循环对应的 1 分钟值才爬到 2.20)。看负载趋势要连续采样,不要拿单次读数下结论。

Q5:chroot 或共享内核的沙箱环境里 uptime 读数是谁的? /proc、/var/run/utmp 是否独立取决于运行环境的隔离方式:共享内核且未隔离 /proc 的环境(如 chroot)里,uptime 反映的是宿主内核的负载与时长;有独立 PID/文件系统命名空间的环境才可能读到自己的视图。跨环境比对负载时要注意这一点。

Q6:up 时长会自己变长吗?会不会重置? up 只在重启时归零,睡眠/休眠恢复后继续累计。若发现 up 时长与预期不符(明显偏小),优先怀疑发生过重启,用 uptime -s 与日志交叉验证。

六、参考链接