diff --git a/Base/usr/share/man/man1/pkill.md b/Base/usr/share/man/man1/pkill.md index 7f3e2fa0f6..ca1fae6aa4 100644 --- a/Base/usr/share/man/man1/pkill.md +++ b/Base/usr/share/man/man1/pkill.md @@ -5,7 +5,7 @@ pkill - Signal processes based on name ## Synopsis ```sh -$ pkill [--count] [--ignore-case] [--echo] [--newest] [--signal signame] [--uid uid-list] [--exact] +$ pkill [--count] [--ignore-case] [--echo] [--newest] [--oldest] [--signal signame] [--uid uid-list] [--exact] ``` ## Options @@ -14,6 +14,7 @@ $ pkill [--count] [--ignore-case] [--echo] [--newest] [--signal signame] [--uid * `-i`, `--ignore-case`: Make matches case-insensitive * `-e`, `--echo`: Display what is killed * `-n`, `--newest`: Kill the most recently created process only +* `-o`, `--oldest`: Select the least recently created process only * `-s signame`, `--signal signame`: Signal to send. The signal name or number may be used * `-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 diff --git a/Userland/Utilities/pkill.cpp b/Userland/Utilities/pkill.cpp index 926857ad75..23d59b6cbf 100644 --- a/Userland/Utilities/pkill.cpp +++ b/Userland/Utilities/pkill.cpp @@ -31,6 +31,7 @@ ErrorOr serenity_main(Main::Arguments args) bool echo = false; bool exact_match = false; bool newest_only = false; + bool oldest_only = false; StringView pattern; HashTable uids_to_filter_by; int signal = SIGTERM; @@ -40,6 +41,7 @@ ErrorOr serenity_main(Main::Arguments args) args_parser.add_option(case_insensitive, "Make matches case-insensitive", "ignore-case", 'i'); args_parser.add_option(echo, "Display what is killed", "echo", 'e'); args_parser.add_option(newest_only, "Kill the most recently created process only", "newest", 'n'); + args_parser.add_option(oldest_only, "Kill the least recently created process only", "oldest", 'o'); args_parser.add_option(Core::ArgsParser::Option { .argument_mode = Core::ArgsParser::OptionArgumentMode::Required, .help_string = "Signal number to send. A signal name or number may be used", @@ -89,6 +91,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; + } + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); PosixOptions options {}; @@ -122,6 +130,8 @@ ErrorOr serenity_main(Main::Arguments args) quick_sort(matched_processes, [](auto const& a, auto const& b) { return a.creation_time < b.creation_time; }); if (newest_only) matched_processes = { matched_processes.last() }; + else if (oldest_only) + matched_processes = { matched_processes.first() }; for (auto& process : matched_processes) { auto result = Core::System::kill(process.pid, signal);