1//
2// pkill.cpp
3//
4// Process killer utility application.
5//
6// Copyright (c) 2010, Applied Informatics Software Engineering GmbH.
7// and Contributors.
8//
9// SPDX-License-Identifier: BSL-1.0
10//
11
12
13#include "Poco/Util/Application.h"
14#include "Poco/Util/Option.h"
15#include "Poco/Util/OptionSet.h"
16#include "Poco/Util/HelpFormatter.h"
17#include "Poco/Process.h"
18#include "Poco/NumberParser.h"
19#include <iostream>
20
21
22using Poco::Util::Application;
23using Poco::Util::Option;
24using Poco::Util::OptionSet;
25using Poco::Util::HelpFormatter;
26using Poco::Util::OptionCallback;
27
28
29class ProcessKillerApp: public Application
30{
31public:
32 ProcessKillerApp():
33 _helpRequested(false),
34 _friendly(false)
35 {
36 }
37
38protected:
39 void defineOptions(OptionSet& options)
40 {
41 Application::defineOptions(options);
42
43 options.addOption(
44 Option("help", "h", "Display help information on command line arguments.")
45 .required(false)
46 .repeatable(false)
47 .callback(OptionCallback<ProcessKillerApp>(this, &ProcessKillerApp::handleHelp)));
48
49 options.addOption(
50 Option("friendly", "f", "Kindly ask application to shut down.")
51 .required(false)
52 .repeatable(false)
53 .callback(OptionCallback<ProcessKillerApp>(this, &ProcessKillerApp::handleFriendly)));
54 }
55
56 void handleHelp(const std::string& name, const std::string& value)
57 {
58 _helpRequested = true;
59 stopOptionsProcessing();
60 }
61
62 void handleFriendly(const std::string& name, const std::string& value)
63 {
64 _friendly = true;
65 }
66
67 void displayHelp()
68 {
69 HelpFormatter helpFormatter(options());
70 helpFormatter.setCommand(commandName());
71 helpFormatter.setUsage("[options] <pid> ...");
72 helpFormatter.setHeader("A utility application to kill processes.");
73 helpFormatter.setFooter("Note that the friendly option only works with applications using Poco::Util::ServerApplication::waitForTerminationRequest().");
74 helpFormatter.format(std::cout);
75 }
76
77 int main(const std::vector<std::string>& args)
78 {
79 if (_helpRequested || args.empty())
80 {
81 displayHelp();
82 }
83 else
84 {
85 for (std::vector<std::string>::const_iterator it = args.begin(); it != args.end(); ++it)
86 {
87 Poco::Process::PID pid = Poco::NumberParser::parseUnsigned(*it);
88 if (_friendly)
89 Poco::Process::requestTermination(pid);
90 else
91 Poco::Process::kill(pid);
92 }
93 }
94 return Application::EXIT_OK;
95 }
96
97private:
98 bool _helpRequested;
99 bool _friendly;
100};
101
102
103POCO_APP_MAIN(ProcessKillerApp)
104