summaryrefslogtreecommitdiff
path: root/src/mailman/core/runner.py
diff options
context:
space:
mode:
authorBarry Warsaw2013-06-17 09:36:43 -0400
committerBarry Warsaw2013-06-17 09:36:43 -0400
commit41059ed20ec668baf41cceaf539f8017171e9651 (patch)
tree391b33289ecb1d02905a897ed581ac9538531f10 /src/mailman/core/runner.py
parentbffd71903475efad53ce6aa59c96a704a905a984 (diff)
downloadmailman-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.py26
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