mirror of https://gitee.com/openkylin/libvirt.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 <jtomko@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
a3a40903d9
commit
a870801ae1
10
run.in
10
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()
|
||||
|
|
Loading…
Reference in New Issue