diff --git a/mopidy/core.py b/mopidy/core.py index 6ed9a601..b89a5456 100644 --- a/mopidy/core.py +++ b/mopidy/core.py @@ -1,5 +1,6 @@ import logging import optparse +import signal import sys import time @@ -22,12 +23,14 @@ from mopidy.gstreamer import GStreamer from mopidy.utils import get_class from mopidy.utils.log import setup_logging from mopidy.utils.path import get_or_create_folder, get_or_create_file -from mopidy.utils.process import GObjectEventThread, stop_all_actors +from mopidy.utils.process import (GObjectEventThread, exit_handler, + stop_all_actors) from mopidy.utils.settings import list_settings_optparse_callback logger = logging.getLogger('mopidy.core') def main(): + signal.signal(signal.SIGTERM, exit_handler) try: options = parse_options() setup_logging(options.verbosity_level, options.save_debug_log) diff --git a/mopidy/utils/process.py b/mopidy/utils/process.py index 47ae6856..5b09148d 100644 --- a/mopidy/utils/process.py +++ b/mopidy/utils/process.py @@ -1,4 +1,5 @@ import logging +import signal import threading import gobject @@ -11,6 +12,13 @@ from mopidy import SettingsError logger = logging.getLogger('mopidy.utils.process') +def exit_handler(signum, frame): + """A :mod:`signal` handler which will exit the program on signal.""" + signals = dict((k, v) for v, k in signal.__dict__.iteritems() + if v.startswith('SIG') and not v.startswith('SIG_')) + logger.info(u'Got %s. Exiting...', signals[signum]) + stop_all_actors() + def stop_all_actors(): num_actors = len(ActorRegistry.get_all()) while num_actors: