]> xenbits.xensource.com Git - libvirt.git/commitdiff
run: gracefully handle SIGHUP, SIGQUIT, SIGTERM
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 9 Mar 2022 10:52:12 +0000 (10:52 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Thu, 10 Mar 2022 08:06:12 +0000 (08:06 +0000)
When using thue 'run' script to launch a daemon, it is intended to
temporarily stop the systemd units and re-start them again after.

When using this script over an SSH connection, it will get SIGHUP
if the connection goes away, and in this case it fails to re-start
the systemd units. We need to catch SIGHUP and turn it into a
normal python exception. For good measure we do the same for
SIGQUIT and SIGTERM too.  SIGINT already gets turned into an
exception by default which we handle.

Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
run.in

diff --git a/run.in b/run.in
index 3be7818d3224177d04eac6af28a6ff640a97a996..c6d34110826f4132aa3f8bf725bb854d029faa01 100644 (file)
--- a/run.in
+++ b/run.in
@@ -43,6 +43,7 @@
 import os
 import os.path
 import random
+import signal
 import sys
 import subprocess
 
@@ -155,6 +156,13 @@ else:
     print("Temporarily stopping systemd units...")
     stopped_units = []
 
+    def sighandler(signum, frame):
+        raise OSError("Signal %d received, terminating" % signum)
+
+    signal.signal(signal.SIGHUP, sighandler)
+    signal.signal(signal.SIGTERM, sighandler)
+    signal.signal(signal.SIGQUIT, sighandler)
+
     try:
         for unit in try_stop_units:
             print(" > %s" % unit)
@@ -167,6 +175,8 @@ else:
         ret = subprocess.call(args, env=env)
     except KeyboardInterrupt:
         pass
+    except Exception as e:
+        print("%s" % e, file=sys.stderr)
     finally:
         print("Re-starting original systemd units...")
         stopped_units.reverse()