Fix termination of child processes when the parent terminates
This commit is contained in:
+14
-9
@@ -57,18 +57,23 @@ namespace proc {
|
|||||||
return std::make_unique<deinit_t>();
|
return std::make_unique<deinit_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Terminates all child processes in a process group.
|
||||||
|
* @param proc The child process itself.
|
||||||
|
* @param group The group of all children in the process tree.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
process_end(bp::child &proc, bp::group &proc_handle) {
|
terminate_process_group(bp::child &proc, bp::group &group) {
|
||||||
if (!proc.running()) {
|
if (group.valid()) {
|
||||||
return;
|
BOOST_LOG(debug) << "Terminating child processes"sv;
|
||||||
|
group.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG(debug) << "Force termination Child-Process"sv;
|
if (proc.valid()) {
|
||||||
proc_handle.terminate();
|
|
||||||
|
|
||||||
// avoid zombie process
|
// avoid zombie process
|
||||||
proc.wait();
|
proc.wait();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boost::filesystem::path
|
boost::filesystem::path
|
||||||
find_working_directory(const std::string &cmd, bp::environment &env) {
|
find_working_directory(const std::string &cmd, bp::environment &env) {
|
||||||
@@ -220,7 +225,7 @@ namespace proc {
|
|||||||
find_working_directory(_app.cmd, _env) :
|
find_working_directory(_app.cmd, _env) :
|
||||||
boost::filesystem::path(_app.working_dir);
|
boost::filesystem::path(_app.working_dir);
|
||||||
BOOST_LOG(info) << "Executing: ["sv << _app.cmd << "] in ["sv << working_dir << ']';
|
BOOST_LOG(info) << "Executing: ["sv << _app.cmd << "] in ["sv << working_dir << ']';
|
||||||
_process = platf::run_command(_app.elevated, true, _app.cmd, working_dir, _env, _pipe.get(), ec, &_process_handle);
|
_process = platf::run_command(_app.elevated, true, _app.cmd, working_dir, _env, _pipe.get(), ec, &_process_group);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
BOOST_LOG(warning) << "Couldn't run ["sv << _app.cmd << "]: System: "sv << ec.message();
|
BOOST_LOG(warning) << "Couldn't run ["sv << _app.cmd << "]: System: "sv << ec.message();
|
||||||
return -1;
|
return -1;
|
||||||
@@ -260,9 +265,9 @@ namespace proc {
|
|||||||
proc_t::terminate() {
|
proc_t::terminate() {
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
placebo = false;
|
placebo = false;
|
||||||
process_end(_process, _process_handle);
|
terminate_process_group(_process, _process_group);
|
||||||
_process = bp::child();
|
_process = bp::child();
|
||||||
_process_handle = bp::group();
|
_process_group = bp::group();
|
||||||
|
|
||||||
for (; _app_prep_it != _app_prep_begin; --_app_prep_it) {
|
for (; _app_prep_it != _app_prep_begin; --_app_prep_it) {
|
||||||
auto &cmd = *(_app_prep_it - 1);
|
auto &cmd = *(_app_prep_it - 1);
|
||||||
|
|||||||
+1
-1
@@ -100,7 +100,7 @@ namespace proc {
|
|||||||
bool placebo {};
|
bool placebo {};
|
||||||
|
|
||||||
boost::process::child _process;
|
boost::process::child _process;
|
||||||
boost::process::group _process_handle;
|
boost::process::group _process_group;
|
||||||
|
|
||||||
file_t _pipe;
|
file_t _pipe;
|
||||||
std::vector<cmd_t>::const_iterator _app_prep_it;
|
std::vector<cmd_t>::const_iterator _app_prep_it;
|
||||||
|
|||||||
Reference in New Issue
Block a user