============================= Starting and stopping Mailman ============================= The Mailman daemon processes can be started and stopped from the command line. Set up ====== 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 Starting ======== >>> 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 Stopping ======== 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).