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 <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2022-03-09 10:52:12 +00:00
parent a3a40903d9
commit a870801ae1

10
run.in
View File

@ -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()