diff --git a/Base/usr/share/man/man1/pgrep.md b/Base/usr/share/man/man1/pgrep.md index ff5b054573..5ce4033a51 100644 --- a/Base/usr/share/man/man1/pgrep.md +++ b/Base/usr/share/man/man1/pgrep.md @@ -5,7 +5,7 @@ pgrep - look up processes based on name ## Synopsis ```sh -$ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--newest] [--uid uid-list] [--invert-match] [--exact] +$ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--newest] [--oldest] [--uid uid-list] [--invert-match] [--exact] ``` ## Options @@ -15,6 +15,7 @@ $ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--newest] [--uid * `-i`, `--ignore-case`: Make matches case-insensitive * `-l`, `--list-name`: List the process name in addition to its pid * `-n`, `--newest`: Select the most recently created process only +* `-o`, `--oldest`: Select the least recently created process only * `-U uid-list`, `--uid uid-list`: Select only processes whose UID is in the given comma-separated list. Login name or numerical user ID may be used * `-x`, `--exact`: Select only processes whose names match the given pattern exactly * `-v`, `--invert-match`: Select non-matching lines diff --git a/Userland/Utilities/pgrep.cpp b/Userland/Utilities/pgrep.cpp index c27fef7dca..7f06b732fa 100644 --- a/Userland/Utilities/pgrep.cpp +++ b/Userland/Utilities/pgrep.cpp @@ -29,6 +29,7 @@ ErrorOr serenity_main(Main::Arguments args) bool invert_match = false; bool exact_match = false; bool newest_only = false; + bool oldest_only = false; HashTable uids_to_filter_by; StringView pattern; @@ -37,6 +38,7 @@ ErrorOr serenity_main(Main::Arguments args) args_parser.add_option(pid_delimiter, "Set the string used to delimit multiple pids", "delimiter", 'd', nullptr); args_parser.add_option(case_insensitive, "Make matches case-insensitive", "ignore-case", 'i'); args_parser.add_option(newest_only, "Select the most recently created process only", "newest", 'n'); + args_parser.add_option(oldest_only, "Select the least recently created process only", "oldest", 'o'); args_parser.add_option(list_process_name, "List the process name in addition to its pid", "list-name", 'l'); args_parser.add_option(Core::ArgsParser::Option { .argument_mode = Core::ArgsParser::OptionArgumentMode::Required, @@ -67,6 +69,12 @@ ErrorOr serenity_main(Main::Arguments args) args_parser.add_positional_argument(pattern, "Process name to search for", "process-name"); args_parser.parse(args); + if (newest_only && oldest_only) { + warnln("The -n and -o options are mutually exclusive"); + args_parser.print_usage(stderr, args.strings[0]); + return 1; + } + PosixOptions options {}; if (case_insensitive) options |= PosixFlags::Insensitive; @@ -101,6 +109,8 @@ ErrorOr serenity_main(Main::Arguments args) quick_sort(matches, [](auto const& a, auto const& b) { return a.creation_time < b.creation_time; }); if (newest_only) matches = { matches.last() }; + else if (oldest_only) + matches = { matches.first() }; auto displayed_at_least_one = false; for (auto& match : matches) {