summaryrefslogtreecommitdiff
path: root/src/mailman/commands/docs/control.rst
blob: b268b50a4ef378a553ed838c1f3d9592a8b95f31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
=============================
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).