Starting and stopping Mailman¶
The Mailman daemon processes can be started and stopped from the command line.
All we care about is the master process; normally it starts a bunch of runners, but we don’t care about any of them, so write a test configuration file for the master that disables all the runners.
>>> from mailman.commands.tests.test_control import make_config
>>> from mailman.commands.cli_control import Start >>> start = Start()
>>> class FakeArgs: ... force = False ... run_as_user = True ... quiet = False ... config = make_config() >>> args = FakeArgs()
Starting the daemons prints a useful message and starts the master watcher process in the background.
>>> start.process(args) Starting Mailman's master runner
>>> from mailman.commands.tests.test_control import find_master
The process exists, and its pid is available in a run time file.
>>> pid = find_master() >>> pid is not None True
You can also stop the master watcher process from the command line, which stops all the child processes too.
>>> from mailman.commands.cli_control import Stop >>> stop = Stop() >>> stop.process(args) Shutting down Mailman's master runner >>> from datetime import datetime, timedelta >>> import os >>> import time >>> import errno >>> def bury_master(): ... until = timedelta(seconds=2) + datetime.now() ... while datetime.now() < until: ... time.sleep(0.1) ... try: ... os.kill(pid, 0) ... os.waitpid(pid, os.WNOHANG) ... except OSError as error: ... if error.errno == errno.ESRCH: ... # The process has exited. ... print('Master process went bye bye') ... return ... else: ... raise ... else: ... raise AssertionError('Master process lingered') >>> bury_master() Master process went bye bye
XXX We need tests for restart (SIGUSR1) and reopen (SIGHUP).