commit:     438ed1265ea9b4b7957d4b3b098abab6a37ebb5a
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 10 19:10:10 2015 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sat Oct 10 19:10:10 2015 +0000
URL:        https://gitweb.gentoo.org/proj/grss.git/commit/?id=438ed126

grs/Execute.py, Interpret.py: clean up signal code

While the following may look like a good idea, its not:

        while True:
            os.kill(pid, signal.SIGKILL)

If pid is zombied, we're stuck in an infinite loop.  Rather
for all processes in the cgroup we just aggressively send a
SIGKILL until only the first ancestor remains.

 grs/Execute.py   | 23 +++++++----------------
 grs/Interpret.py | 18 +++---------------
 2 files changed, 10 insertions(+), 31 deletions(-)

diff --git a/grs/Execute.py b/grs/Execute.py
index 0e70221..7b0e5a2 100644
--- a/grs/Execute.py
+++ b/grs/Execute.py
@@ -42,12 +42,6 @@ class Execute():
             logfile     - A file to log output to.  If logfile = None, then we 
log
                           to sys.stdout.
         """
-        def signalexit():
-            pid = os.getpid()
-            while True:
-                os.kill(pid, signal.SIGTERM)
-                time.sleep(2.0)
-
         if shell:
             args = cmd
         else:
@@ -71,19 +65,16 @@ class Execute():
         if not timed_out:
             # _rc = None if we had a timeout
             _rc = proc.returncode
-            if _rc:
-                _file.write('EXIT CODE: %d\n' % _rc)
-                if not failok:
-                    _file.write('SENDING SIGTERM\n')
-                    _file.close()
-                    signalexit()
+            _file.write('EXIT CODE: %d\n' % _rc)
 
         if timed_out:
             _file.write('TIMEOUT ERROR: %s\n' % cmd)
-            if not failok:
-                _file.write('SENDING SIGTERM\n')
-                _file.close()
-                signalexit()
+
+        if not failok and ( _rc != 0 or timed_out):
+            pid = os.getpid()
+            _file.write('SENDING SIGTERM: %s\n' % pid)
+            _file.close()
+            os.kill(pid, signal.SIGTERM)
 
         # Only close a logfile, don't close sys.stderr!
         if logfile:

diff --git a/grs/Interpret.py b/grs/Interpret.py
index 3e2c408..5624fd4 100644
--- a/grs/Interpret.py
+++ b/grs/Interpret.py
@@ -64,12 +64,7 @@ class Interpret(Daemon):
                         if mypid == pid:
                             continue
                         try:
-                            for i in range(10):
-                                os.kill(pid, signal.SIGTERM)
-                                time.sleep(0.2)
-                            while True:
-                                os.kill(pid, signal.SIGKILL)
-                                time.sleep(0.2)
+                            os.kill(pid, signal.SIGKILL)
                         except ProcessLookupError:
                             pass
             try:
@@ -79,13 +74,6 @@ class Interpret(Daemon):
             sys.exit(signum + 128)
 
 
-        def signalexit():
-            pid = os.getpid()
-            while True:
-                os.kill(pid, signal.SIGTERM)
-                time.sleep(2.0)
-
-
         def semantic_action(_line, objs, nargs, func, *args):
             """ Execute the directive """
             err = None
@@ -104,7 +92,7 @@ class Interpret(Daemon):
                 _lo.log('Bad command:   %s' % _line)
                 _lo.log('Error message: %s' % err)
                 _lo.log('SENDING SIGTERM\n')
-                signalexit()
+                os.kill(os.getpid(), signal.SIGTERM)
 
 
         def stampit(progress):
@@ -262,7 +250,7 @@ class Interpret(Daemon):
                     _lo.log('Bad command: %s' % _line)
                     _lo.log('Unknown verb: %s' % verb)
                     _lo.log('SENDING SIGTERM\n')
-                    signalexit()
+                    os.kill(os.getpid(), signal.SIGTERM)
 
                 stampit(progress)
 

Reply via email to