配置文件
1$ systemctl cat sshd.service
2
3[Unit]
4Description=OpenSSH server daemon
5Documentation=man:sshd(8) man:sshd_config(5)
6After=network.target sshd-keygen.service
7Wants=sshd-keygen.service
8
9[Service]
10EnvironmentFile=/etc/sysconfig/sshd
11ExecStart=/usr/sbin/sshd -D $OPTIONS
12ExecReload=/bin/kill -HUP $MAINPID
13Type=simple
14KillMode=process
15Restart=on-failure
16RestartSec=42s
17
18[Install]
19WantedBy=multi-user.target
Unit区块:启动顺序和依赖关系
Description
字段给出当前服务的简单描述。
Documentation
字段给出文档位置。
After
字段表示如果network.target
或sshd-keygen.service
需要启动,那么sshd.service
应该在它们之后启动。
Before
字段定义sshd.service
应该在哪些服务之前启动。
Wants
字段表示sshd.service
与sshd-keygen.service
之间存在"弱依赖"关系,即如果sshd-keygen.service
启动失败或停止运行,不影响sshd.service
继续执行。
Requires
字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service
也必须退出。
注意,After和Before字段只涉及启动顺序,不涉及依赖关系。
注意,Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
举例来说,某 Web 应用需要 postgresql 数据库储存数据。在配置文件中,它只定义要在 postgresql 之后启动,而没有定义依赖 postgresql 。上线后,由于某种原因,postgresql 需要重新启动,在停止服务期间,该 Web 应用就会无法建立数据库连接。
Service区块:如何启动当前服务
EnvironmentFile
字段指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。上面的例子中,sshd 的环境参数文件是/etc/sysconfig/sshd
。
ExecStart
字段:定义启动进程时执行的命令。上面的例子中,启动sshd,执行的命令是/usr/sbin/sshd -D $OPTIONS
,其中的变量$OPTIONS
就来自EnvironmentFile
字段指定的环境参数文件。
Install区块:如何安装这个配置文件,即怎样做到开机启动。
WantedBy
字段:表示该服务所在的Target。Target的含义是服务组,表示一组服务。WantedBy=multi-user.target
指的是,sshd
所在的Target是multi-user.target
。
这个设置非常重要,因为执行systemctl enable sshd.service
命令时,sshd.service
的一个符号链接,就会放在/etc/systemd/system
目录下面的multi-user.target.wants
子目录之中。
Systemd 有默认的启动 Target,下面的结果表示,默认的启动 Target 是multi-user.target
。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable
命令能设置开机启动的原因。
一般来说,常用的 Target 有两个:一个是multi-user.target
,表示多用户命令行状态;另一个是graphical.target
,表示图形用户状态,它依赖于multi-user.target
。官方文档有一张非常清晰的Target依赖关系图。
1#查看默认的启动 target
2$ systemctl get-default
3multi-user.target
4#查看 multi-user.target 包含的所有服务
5$ systemctl list-dependencies multi-user.target
6#切换到另一个 target,shutdown.target 就是关机状态
7$ sudo systemctl isolate shutdown.target