资讯动态

SerenityOS `uptime` 命令详解:从 man 手册到内核时钟的完整链路

发布时间:2026/9/10 9:41:51 来源:尧图企业网站定制
SerenityOSuptime命令详解从 man 手册到内核时钟的完整链路【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenityuptime是 SerenityOS 中一条用于查询系统已运行时间的标准命令行工具其行为由 Base/usr/share/man/man1/uptime.md 这份 man 手册定义。本文以该手册为核心结合 Userland/Utilities/uptime.cpp、Kernel/FileSystem/SysFS/Subsystems/Kernel/Uptime.cpp 与 AK/NumberFormat.cpp 等源码讲清它的用法、输出格式与底层数据来源帮助你既能直接上手使用也能理解一条命令背后从用户态到内核态的完整实现链路。命令概述uptime在 SerenityOS 的 Shell 中直接输入即可运行其作用是以单行文本形式向 STDOUT 输出系统的运行状态信息包括系统上线时间与已持续运行时长。$ uptime 2024-01-24 06:23:27 up 4:20:00默认输出分为两个部分前半段2024-01-24 06:23:27当前系统时间日期 时分秒后半段up 4:20:00系统自启动以来已运行的时长采用H:MM:SS的数字时钟格式小时不足两位时省略前导零如4:20:00。与 Linux/BSD 的uptime不同SerenityOS 的默认输出末尾还会追加当前登录用户数详见下文登录用户统计一节。手册中标注的FIXME见 Userland/Utilities/uptime.cpp也提示为了对齐 Linux 与 BSD未来还计划输出系统负载均值load averages但当前内核尚未提供该数据。命令行选项uptime支持两个选项均由 LibCore/ArgsParser.h 解析定义于源码 Userland/Utilities/uptime.cpp短选项长选项功能-p--pretty仅输出运行时长使用人类可读的自然语言格式-s--since仅输出系统上线的时间点格式为yyyy-mm-dd HH:MM:SS两个选项的源码行为Userland/Utilities/uptime.cpp当-s生效时用当前时间戳减去运行秒数反推出系统上线时刻再通过 LibCore/DateTime 格式化为日期时间字符串当-p生效时调用human_readable_time()输出自然语言时长两者均未指定时输出默认格式当前时间 数字时钟时长 用户数。注意-p与-s同时给出时-s分支优先源码中先判断output_since-p会被忽略二者互斥逻辑并未在参数解析层强制属于使用时需留意的细节。示例演示默认输出$ uptime 2024-01-24 06:23:27 up 4:20:00人类可读格式-p$ uptime -p Up 2 minutes, 20 seconds系统上线时间-s$ uptime -s 2024-01-24 06:23:27输出格式的源码实现人类可读时长human_readable_time()-p使用的human_readable_time()定义于 AK/NumberFormat.cpp其逻辑为依次以 86400、3600、60 为除数分解出天数、小时、分钟、剩余秒数再按非零才输出 单复数后缀day/days的规则拼接例如140秒 →Up 2 minutes, 20 seconds90061秒 →1 day 1 hour 1 minute 1 second一个值得注意的边界处理若天、时、分均为 0则即使秒数为 0 也会输出0 seconds保证输出永不空白。数字时钟格式human_readable_digital_time()默认输出末尾的4:20:00由 AK/NumberFormat.cpp 的human_readable_digital_time()生成小时、分钟、秒分别以{:02}补零小时为 0 时省略最终形如H:MM:SS。登录用户统计默认模式无选项下uptime会读取/var/run/utmp一个 JSON 文件以该文件对象中的条目数作为登录用户数并根据数量输出单复数2024-01-24 06:23:27 up 4:20:00, 1 user 2024-01-24 06:23:27 up 4:20:00, 3 users该 JSON 文件由 Userland/Utilities/utmpupdate.cpp 维护——系统会话在登录/注销时通过utmpupdate -c/-d增删条目详见utmpupdate的 man 手册 Base/usr/share/man/man1/utmpupdate.md。同一机制也被 Userland/Utilities/w.cpp 的w命令复用。底层原理数据从内核到用户态数据源头SysFS 中的/sys/kernel/uptimeuptime的运行秒数并非自己计时而是读取 SysFS 虚拟文件/sys/kernel/uptime源码见 Userland/Utilities/uptime.cpp。该文件由内核的 SysFS 子系统实时生成实现位于 Kernel/FileSystem/SysFS/Subsystems/Kernel/Uptime.cppErrorOrvoid SysFSUptime::try_generate(KBufferBuilder builder) { return builder.appendff({}\n, TimeManagement::the().uptime_ms() / 1000); }即每次读取时内核都会把TimeManagement维护的毫秒级运行时长uptime_ms()见 Kernel/Time/TimeManagement.cpp除以 1000 后写出——因此uptime拿到的是自系统启动以来的总秒数字符串转整数由AK::StringUtils::convert_to_uint()完成。沙箱化访问pledge 与 unveiluptime启动后立即声明最小权限Userland/Utilities/uptime.cpppledge(stdio rpath)只保留标准 I/O 与只读路径访问能力unveil(/sys/kernel/uptime, r)与unveil(/var/run/utmp, r)把可访问的文件系统路径收敛到仅这两个只读文件随后unveil(nullptr, nullptr)锁定。这体现了 SerenityOS 用户态工具默认最小权限的典型模式即使工具被攻破也几乎无路径可写、无额外文件可读。时区与时间格式化-s与默认输出中的时间字符串均通过 LibCore/DateTime 生成。-s分支计算since_timestamp 当前时间戳 - 运行秒数后再格式化因此输出的是系统当前时区下的上线时刻。构建与运行环境uptime属于 SerenityOS 的用户态基础工具集随系统镜像一同编译构建注册见 Userland/Utilities/CMakeLists.txt。使用前提它依赖内核 SysFS/sys/kernel/uptime与/var/run/utmp因此只能在 SerenityOS 系统内运行不能直接移植到普通 Linux 主机在 SerenityOS 的 Shell 中直接执行即可无需额外安装或配置由于没有参数时依赖utmp文件中的会话条目-p/-s两种仅读内核时钟的模式在无登录会话的环境中也能正常工作。小结uptime默认输出当前时间 运行时长H:MM:SS 登录用户数-p输出自然语言时长-s输出系统上线时刻运行秒数来自内核 SysFS 节点/sys/kernel/uptime用户数来自/var/run/utmp工具通过pledge/unveil以最小权限运行时长格式化由 AK 的human_readable_time/human_readable_digital_time完成。手册原文位于 Base/usr/share/man/man1/uptime.md源码位于 Userland/Utilities/uptime.cpp感兴趣的读者可沿着这两处继续深入。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价