]> granicus.if.org Git - icinga2/commitdiff
Kill entire process group after plugin timeout
authorGunnar Beutner <gunnar@beutner.name>
Wed, 11 Mar 2015 06:12:59 +0000 (07:12 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 11 Mar 2015 06:38:07 +0000 (07:38 +0100)
fixes #8540

lib/base/process.cpp

index b8eb93b8631820833eb150070d2e06cf566e6c7a..5f66940a74111ce1dd2368d63a578b2a45b9e0b0 100644 (file)
@@ -530,6 +530,11 @@ void Process::Run(const boost::function<void(const ProcessResult&)>& callback)
        if (m_Process == 0) {
                // child process
 
+               if (setsid() < 0) {
+                       perror("setsid() failed");
+                       _exit(128);
+               }
+
                if (dup2(fds[1], STDOUT_FILENO) < 0 || dup2(fds[1], STDERR_FILENO) < 0) {
                        perror("dup2() failed");
                        _exit(128);
@@ -611,14 +616,14 @@ bool Process::DoEvents(void)
 
                if (timeout < Utility::GetTime()) {
                        Log(LogWarning, "Process")
-                           << "Killing process " << m_PID << " (" << PrettyPrintArguments(m_Arguments)
+                           << "Killing process group " << m_PID << " (" << PrettyPrintArguments(m_Arguments)
                            << ") after timeout of " << m_Timeout << " seconds";
 
                        m_OutputStream << "<Timeout exceeded.>";
 #ifdef _WIN32
                        TerminateProcess(m_Process, 1);
 #else /* _WIN32 */
-                       kill(m_Process, SIGKILL);
+                       kill(-m_Process, SIGKILL);
 #endif /* _WIN32 */
 
                        is_timeout = true;