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. Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> --- 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() -- 2.35.1