uptime 命令详解与参数实测(Ubuntu 22.04)
uptime 命令逐参数实测详解:默认输出四段逐段解读(当前时间、up 时长、登录用户数、1/5/15 分钟平均负载)、-p 友好格式、-s 启动时间与 /proc/uptime 换算交叉验证,并以 2 个 yes 死循环实测负载爬升回落曲线与 CPU 核数相对判断,全部回显在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。
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.05 | 1 分钟、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 与日志交叉验证。
六、参考链接
- procps-ng 项目主页(uptime 源码所属项目):https://gitlab.com/procps-ng/procps
- Ubuntu 22.04 uptime(1) 在线手册页:https://manpages.ubuntu.com/manpages/jammy/en/man1/uptime.1.html
- proc(5) 手册页(/proc/loadavg 与 /proc/uptime 字段定义):https://man7.org/linux/man-pages/man5/proc.5.html
- Load (computing)——平均负载口径的历史与跨系统对比:https://en.wikipedia.org/wiki/Load_(computing)
- who(1)、w(1) 与 uptime 的联动关系参见本专栏《who 命令详解与参数实测(Ubuntu 22.04)》《w 命令详解与参数实测(Ubuntu 22.04)》