uptime: Bring output closer to Linux/BSDs, and add -p flag

The -p flag is equivalent to the previous behavior: outputting the
uptime in a human-readable form.

We don't seem to expose the number of online users or the load averages,
so those sections are missing from the output compared to those OSes.
This commit is contained in:
Sam Atkins 2024-01-24 12:32:50 +00:00 committed by Andreas Kling
parent 388856dc7e
commit 8faeb13036
2 changed files with 33 additions and 2 deletions

View file

@ -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
```

View file

@ -1,19 +1,28 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, Karol Kosek <krkk@serenityos.org>
* Copyright (c) 2024, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/NumberFormat.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/DateTime.h>
#include <LibCore/File.h>
#include <LibCore/System.h>
#include <LibMain/Main.h>
ErrorOr<int> serenity_main(Main::Arguments)
ErrorOr<int> 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<int> 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;
}