| 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 |  | 
| 22 | using Poco::Util::Application; | 
| 23 | using Poco::Util::Option; | 
| 24 | using Poco::Util::OptionSet; | 
| 25 | using Poco::Util::HelpFormatter; | 
| 26 | using Poco::Util::OptionCallback; | 
| 27 |  | 
| 28 |  | 
| 29 | class ProcessKillerApp: public Application | 
| 30 | { | 
| 31 | public: | 
| 32 | 	ProcessKillerApp(): | 
| 33 | 		_helpRequested(false), | 
| 34 | 		_friendly(false) | 
| 35 | 	{ | 
| 36 | 	} | 
| 37 |  | 
| 38 | protected:		 | 
| 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 | 		 | 
| 97 | private: | 
| 98 | 	bool _helpRequested; | 
| 99 | 	bool _friendly; | 
| 100 | }; | 
| 101 |  | 
| 102 |  | 
| 103 | POCO_APP_MAIN(ProcessKillerApp) | 
| 104 |  |