From a870801ae1a2ee56f850ff06526223c21e31816b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Wed, 9 Mar 2022 10:52:12 +0000 Subject: [PATCH] run: gracefully handle SIGHUP, SIGQUIT, SIGTERM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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é --- run.in | 10 ++++++++++ 1 file changed, 10 insertions(+) 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()