diff --git a/Base/usr/share/man/man1/uptime.md b/Base/usr/share/man/man1/uptime.md index c00da08187..b3b61cc0a6 100644 --- a/Base/usr/share/man/man1/uptime.md +++ b/Base/usr/share/man/man1/uptime.md @@ -8,9 +8,23 @@ uptime - Tell how long the system has been running $ uptime ``` +## Description + +`uptime` outputs information about the system, in a single line, to STDOUT. +This information includes when the system came online and how long it has been up. + +## Options + +* `-p`, `--pretty`: Output only the uptime, in human-readable format. + ## Examples ```sh $ uptime +2024-01-24 06:23:27 up 4:20:00 +``` + +```sh +$ uptime -p Up 2 minutes, 20 seconds ``` diff --git a/Userland/Utilities/uptime.cpp b/Userland/Utilities/uptime.cpp index e289eb5517..ad3c318590 100644 --- a/Userland/Utilities/uptime.cpp +++ b/Userland/Utilities/uptime.cpp @@ -1,19 +1,28 @@ /* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2022, Karol Kosek + * Copyright (c) 2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #include +#include +#include #include #include #include -ErrorOr serenity_main(Main::Arguments) +ErrorOr serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio rpath")); + bool pretty_output = false; + + Core::ArgsParser args_parser; + args_parser.add_option(pretty_output, "Output only the uptime, in human-readable format", "pretty", 'p'); + args_parser.parse(arguments); + auto file = TRY(Core::File::open("/sys/kernel/uptime"sv, Core::File::OpenMode::Read)); TRY(Core::System::pledge("stdio")); @@ -25,6 +34,14 @@ ErrorOr serenity_main(Main::Arguments) return Error::from_string_literal("Couldn't convert to number"); auto seconds = maybe_seconds.release_value(); - outln("Up {}", human_readable_time(seconds)); + if (pretty_output) { + outln("Up {}", human_readable_time(seconds)); + } else { + auto current_time = TRY(Core::DateTime::now().to_string()); + // FIXME: To match Linux and the BSDs, we should also include the number of current users, + // and some load averages, but these don't seem to be available yet. + outln("{} up {}", current_time, human_readable_digital_time(seconds)); + } + return 0; }