Browse Source

Merge pull request #1594 from julian-klode/bugfix/sighup

Handle SIGHUP for proper unlock on lost connection, fixes #1593
enkore 8 years ago
parent
commit
8a62b16ecf
1 changed files with 16 additions and 0 deletions
  1. 16 0
      borg/archiver.py

+ 16 - 0
borg/archiver.py

@@ -1666,6 +1666,14 @@ def sig_term_handler(signum, stack):
     raise SIGTERMReceived
 
 
+class SIGHUPReceived(BaseException):
+    pass
+
+
+def sig_hup_handler(signum, stack):
+    raise SIGHUPReceived
+
+
 def setup_signal_handlers():  # pragma: no cover
     sigs = []
     if hasattr(signal, 'SIGUSR1'):
@@ -1674,7 +1682,12 @@ def setup_signal_handlers():  # pragma: no cover
         sigs.append(signal.SIGINFO)  # kill -INFO pid (or ctrl-t)
     for sig in sigs:
         signal.signal(sig, sig_info_handler)
+    # If we received SIGTERM or SIGHUP, catch them and raise a proper exception
+    # that can be handled for an orderly exit. SIGHUP is important especially
+    # for systemd systems, where logind sends it when a session exits, in
+    # addition to any traditional use.
     signal.signal(signal.SIGTERM, sig_term_handler)
+    signal.signal(signal.SIGHUP, sig_hup_handler)
 
 
 def main():  # pragma: no cover
@@ -1713,6 +1726,9 @@ def main():  # pragma: no cover
     except SIGTERMReceived:
         msg = 'Received SIGTERM.'
         exit_code = EXIT_ERROR
+    except SIGHUPReceived:
+        msg = 'Received SIGHUP.'
+        exit_code = EXIT_ERROR
     if msg:
         logger.error(msg)
     if args.show_rc: