From faba28dd9451e7e2470451ff8013802b8baacb30 Mon Sep 17 00:00:00 2001 From: shortcutme Date: Sat, 23 Mar 2019 03:41:42 +0100 Subject: [PATCH] Proper handle of sigterm signal, log reason of shutdown --- src/Debug/DebugHook.py | 37 +++++++++++++++++++++++-------------- zeronet.py | 6 ------ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/Debug/DebugHook.py b/src/Debug/DebugHook.py index c31ca4df..72c46778 100644 --- a/src/Debug/DebugHook.py +++ b/src/Debug/DebugHook.py @@ -1,16 +1,18 @@ import sys import logging +import signal +import importlib import gevent import gevent.hub from Config import config -import importlib +from . import Debug last_error = None -def shutdown(): - print("Shutting down...") +def shutdown(reason="Unknown"): + logging.info("Shutting down (reason: %s)..." % reason) if "file_server" in dir(sys.modules["main"]) and sys.modules["main"].file_server.running: try: if "file_server" in dir(sys.modules["main"]): @@ -24,7 +26,7 @@ def shutdown(): sys.exit(0) # Store last error, ignore notify, allow manual error logging -def handleError(*args): +def handleError(*args, **kwargs): global last_error if not args: # Manual called args = sys.exc_info() @@ -33,22 +35,23 @@ def handleError(*args): silent = False if args[0].__name__ != "Notify": last_error = args + if args[0].__name__ == "KeyboardInterrupt": - shutdown() - return - if not silent and args[0].__name__ != "Notify": + shutdown("Keyboard interrupt") + elif not silent and args[0].__name__ != "Notify": logging.exception("Unhandled exception") if "greenlet.py" not in args[2].tb_frame.f_code.co_filename: # Don't display error twice - sys.__excepthook__(*args) + sys.__excepthook__(*args, **kwargs) # Ignore notify errors -def handleErrorNotify(*args): - if args[0].__name__ == "KeyboardInterrupt": - shutdown() - if args[0].__name__ != "Notify": - logging.exception("Unhandled exception") - sys.__excepthook__(*args) +def handleErrorNotify(*args, **kwargs): + err = args[0] + if err.__name__ == "KeyboardInterrupt": + shutdown("Keyboard interrupt") + elif err.__name__ != "Notify": + logging.error("Unhandled exception: %s" % [args]) + sys.__excepthook__(*args, **kwargs) if config.debug: # Keep last error for /Debug @@ -80,6 +83,12 @@ def handleGreenletError(self, context, type, value, tb): gevent.hub.Hub.handle_error = handleGreenletError +try: + signal.signal(signal.SIGTERM, lambda signum, stack_frame: shutdown("SIGTERM")) +except Exception as err: + logging.debug("Error setting up SIGTERM watcher: %s" % err) + + if __name__ == "__main__": import time from gevent import monkey diff --git a/zeronet.py b/zeronet.py index 2f4cc561..3602788c 100755 --- a/zeronet.py +++ b/zeronet.py @@ -15,12 +15,6 @@ def main(): main = None try: - import signal - try: - signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(0)) - except Exception as err: - print("Error setting up SIGTERM watcher: %s" % err) - app_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(app_dir) # Change working dir to zeronet.py dir sys.path.insert(0, os.path.join(app_dir, "src/lib")) # External liblary directory