diff --git a/Base/usr/share/man/man1/pkill.md b/Base/usr/share/man/man1/pkill.md index 0def88d62d..dc40e5847c 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] [--signal number] [--uid uid-list] [--exact] +$ pkill [--count] [--ignore-case] [--echo] [--signal signame] [--uid uid-list] [--exact] ``` ## Options @@ -13,7 +13,7 @@ $ pkill [--count] [--ignore-case] [--echo] [--signal number] [--uid uid-list] [- * `-c`, `--count`: Display the number of matching processes * `-i`, `--ignore-case`: Make matches case-insensitive * `-e`, `--echo`: Display what is killed -* `-s number`, `--signal number`: Signal number to send +* `-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 82834ba2c9..6b95dedabf 100644 --- a/Userland/Utilities/pkill.cpp +++ b/Userland/Utilities/pkill.cpp @@ -37,7 +37,27 @@ ErrorOr serenity_main(Main::Arguments args) args_parser.add_option(display_number_of_matches, "Display the number of matching processes", "count", 'c'); 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(signal, "Signal number to send", "signal", 's', "number"); + 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", + .long_name = "signal", + .short_name = 's', + .value_name = "signame", + .accept_value = [&signal](StringView signal_string) { + if (signal_string.is_empty()) + return false; + + if (is_ascii_alpha(signal_string[0])) + signal = getsignalbyname(&signal_string[0]); + else if (auto maybe_signal = signal_string.to_int(); maybe_signal.has_value()) + signal = maybe_signal.value(); + + if (signal <= 0 || signal >= NSIG) + return false; + + return true; + }, + }); args_parser.add_option(Core::ArgsParser::Option { .argument_mode = Core::ArgsParser::OptionArgumentMode::Required, .help_string = "Select only processes whose UID is in the given comma-separated list. Login name or numerical user ID may be used",