From: Daniel P. Berrangé Date: Wed, 9 Mar 2022 10:52:12 +0000 (+0000) Subject: run: gracefully handle SIGHUP, SIGQUIT, SIGTERM X-Git-Tag: v8.2.0-rc1~141 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a870801ae1a2ee56f850ff06526223c21e31816b;p=thirdparty%2Flibvirt.git run: gracefully handle SIGHUP, SIGQUIT, SIGTERM 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 Signed-off-by: Daniel P. Berrangé --- diff --git a/run.in b/run.in index 3be7818d32..c6d3411082 100644 --- 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()