summaryrefslogtreecommitdiff
path: root/docs/services.md
blob: 223cfb5e850c8ded1f63f6411e13e3c2f0498ad3 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# Service Files

Services that can be started and managed by init are described by service
description files stored in `/usr/share/init`.

The init process actually reads from `/etc/init.d` which contains symlinks to
the actual service files.

Enabling a service means adding a symlink, disabling means removing a symlink.

Service descriptions can be parameterized. The arguments are extracted from the
name of the symlink. Currently only 1 parameter is supported. The argument
value is separated from the service name by an '@' character in the symlink
name.



Below is an annotated example for a simple, service description for a
generic, parameterized agetty service:

    #
    # The text that init should print out when the status of the
    # service changes.
    #
    # The '%0' is replaced with the first argument extracted from the
    # symlink name.
    #
    description "agetty on %0"

    #
    # How to run the service. 'respawn' means restart the service when it
    # terminates, 'once' means run it only once and continue with other
    # services in the mean while, 'wait' means run it once, but block until
    # it exits.
    #
    type respawn

    #
    # When to start the service. 'boot' means when booting the system. Other
    # options are 'reboot', 'shutdown' and 'ctrlaltdel'. The system always
    # starts into the 'boot' target and then later transitions to one of the
    # others.
    #
    target boot

    #
    # A list of service names that must be started before this service can
    # be run, i.e. this services needs to be started after those.
    #
    # This can only refer to generic names, not specific instances. For
    # instance, you can say "after getty" to make sure a service comes up after
    # all gettys are started, but you cannot specify "after agetty@tty1".
    #
    # Similar to 'after', there is also a 'before' keyword for specifying
    # dependencies.
    #
    after sysinit

    #
    # The 'tty' directive specifies a file to which all I/O of the process is
    # redirected. The specified device file is used as a controlling tty for
    # the process and a new session is created with the service process as
    # session leader.
    #
    # In this example, we derive the controlling tty from the service
    # description argument.
    #
    tty "/dev/%0"
    
    #
    # The 'exec' directive specifies the command to execute in order to start
    # the service. See in the example below on how to run multiple commands.
    #
    # Again we use the argument to specify what terminal our getty
    # should run on.
    #
    exec agetty %0 linux

As can be seen in this simple example, each line in a service description is
made up of a keyword, followed by one or more arguments and terminated by a
line break.

Blank lines are ignored and shell-style comments can be used.

Arguments are separated by space. Quotation marks can be used to treat
something containing spaces or comment character as a single argument.

In between quotation marks, C-style escape sequences can be used.

Argument substitution (arguments derived from the symlink name) can be
done using a '%' sign, followed by the argument index. A '%' sign can be
escaped by writing '%%'.


If a service should sequentially run multiple commands, they can be grouped
inside braces as can be seen in the following, abbreviated example:

    description "mount /var"
    type wait
    target boot
    before vfs
    exec {
        mount -t tmpfs none /var
        mkdir /var/log -m 0755
        mkdir /var/spool -m 0755
        mkdir /var/lib -m 0755
        mkdir /var/tmp -m 0755
        mount --bind /cfg/preserve/var_lib /var/lib
    }