diff options
| author | Barry Warsaw | 2013-06-17 09:36:43 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2013-06-17 09:36:43 -0400 |
| commit | 41059ed20ec668baf41cceaf539f8017171e9651 (patch) | |
| tree | 391b33289ecb1d02905a897ed581ac9538531f10 /src/mailman/core/runner.py | |
| parent | bffd71903475efad53ce6aa59c96a704a905a984 (diff) | |
| download | mailman-41059ed20ec668baf41cceaf539f8017171e9651.tar.gz mailman-41059ed20ec668baf41cceaf539f8017171e9651.tar.zst mailman-41059ed20ec668baf41cceaf539f8017171e9651.zip | |
Diffstat (limited to 'src/mailman/core/runner.py')
| -rw-r--r-- | src/mailman/core/runner.py | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/mailman/core/runner.py b/src/mailman/core/runner.py index a8412195d..347726b85 100644 --- a/src/mailman/core/runner.py +++ b/src/mailman/core/runner.py @@ -26,6 +26,7 @@ __all__ = [ import time +import signal import logging import traceback @@ -37,6 +38,7 @@ from zope.interface import implementer from mailman.config import config from mailman.core.i18n import _ +from mailman.core.logging import reopen from mailman.core.switchboard import Switchboard from mailman.interfaces.languages import ILanguageManager from mailman.interfaces.listmanager import IListManager @@ -46,12 +48,12 @@ from mailman.utilities.string import expand dlog = logging.getLogger('mailman.debug') elog = logging.getLogger('mailman.error') +rlog = logging.getLogger('mailman.runner') @implementer(IRunner) class Runner: - intercept_signals = True is_queue_runner = True def __init__(self, name, slice=None): @@ -85,10 +87,32 @@ class Runner: self.max_restarts = int(section.max_restarts) self.start = as_boolean(section.start) self._stop = False + self.status = 0 def __repr__(self): return '<{0} at {1:#x}>'.format(self.__class__.__name__, id(self)) + def signal_handler(self, signum, frame): + signame = { + signal.SIGTERM: 'SIGTERM', + signal.SIGINT: 'SIGINT', + signal.SIGUSR1: 'SIGUSR1', + }.get(signum, signum) + if signum in (signal.SIGTERM, signal.SIGINT, signal.SIGUSR1): + self.stop() + self.status = signum + rlog.info('%s runner caught %s. Stopping.', self.name, signame) + elif signum == signal.SIGHUP: + reopen() + rlog.info('%s runner caught SIGHUP. Reopening logs.', self.name) + + def set_signals(self): + """See `IRunner`.""" + signal.signal(signal.SIGHUP, self.signal_handler) + signal.signal(signal.SIGINT, self.signal_handler) + signal.signal(signal.SIGTERM, self.signal_handler) + signal.signal(signal.SIGUSR1, self.signal_handler) + def stop(self): """See `IRunner`.""" self._stop = True |
