systemd 使用单位(units)来定义系统组件和服务,每个单位都有一个对应的配置文件,其中定义了单位的属性和依赖关系。
systemd 使用使用配置文件来管理服务之间的依赖关系。这些配置文件通常位于 /etc/systemd/system/ 目录或 /usr/lib/systemd/system/ 目录中,具体取决于系统配置。
以下是 systemd 如何管理依赖关系的几种常见方式:
Requires 和 Wants:通过在单位配置文件中使用 Requires 和 Wants 关键字,可以指定一个单位依赖于其他单位。Requires 表示强依赖关系,即被依赖单位必须成功启动才能启动当前单位。Wants 表示弱依赖关系,即被依赖单位的启动不是必需的,但如果被依赖单位可用,当前单位会优先启动。
Before 和 After:通过 Before 和 After 关键字,可以定义单位之间的启动顺序。Before 表示当前单位应在指定的单位之前启动,而 After 表示当前单位应在指定的单位之后启动。这样可以确保在启动过程中按照预定义的顺序启动服务。
PartOf 和 RequiresMountsFor:PartOf 关键字用于定义一个单位是另一个单位的一部分,如果主单位启动或停止,从属单位也会相应启动或停止。RequiresMountsFor 关键字用于指定一个单位所需的文件系统挂载点。
OnFailure:使用 OnFailure 关键字,可以定义一个单位在指定的单位启动失败时才启动。这对于定义容错机制和后备服务很有用。
通过这些依赖关系配置,systemd 可以确保在启动和管理过程中按照正确的顺序启动和停止服务。依赖关系的定义还可以确保在一个服务依赖的其他服务可用时,才启动该服务,从而提高系统的可靠性和稳定性。
可以使用 systemctl 命令来查看和管理单位及其依赖关系。例如,systemctl status <unit> 可以查看单位的状态和依赖关系,systemctl enable <unit> 可以启用一个单位,systemctl start <unit> 可以启动一个单位,等等。
请注意,为了正确管理和配置依赖关系,建议仔细阅读 systemd 的文档,并了解每个单位的属性和关键字的含义。
示例下面是一个使用 Requires、Wants、Before 和 After 的示例:
假设我们有两个服务:serviceA.service 和 serviceB.service。serviceA.service 需要在 serviceB.service 启动之后才能启动,而 serviceB.service 则不依赖于其他服务。
serviceA.service 的配置文件内容如下:
[Unit]Description=Service ARequires=serviceB.serviceAfter=serviceB.service[Service]ExecStart=/path/to/serviceAserviceB.service 的配置文件内容如下:
[Unit]Description=Service B[Service]ExecStart=/path/to/serviceB在这个示例中,serviceA.service 配置文件中的 Requires=serviceB.service 表示 serviceA.service 依赖于 serviceB.service,而 After=serviceB.service 则指定 serviceA.service 必须在 serviceB.service 之后启动。这样,当启动 serviceA.service 时,systemd 将自动启动 serviceB.service,并确保 serviceB.service 在 serviceA.service 之前启动。
请注意,以上示例仅为演示目的,实际的配置文件可能需要更多的选项和设置,具体取决于服务的需求和复杂性。
官方示例使用 命令行查看 操作系统中已存在的服务配置 acpid.service
xzbd@ubuntu:~$ cat /usr/lib/systemd/system/acpid.service [Unit]Description=ACPI event daemonRequires=acpid.socketConditionVirtualization=!containerDocumentation=man:acpid(8)[Service]StandardInput=socketEnvironmentFile=/etc/default/acpidExecStart=/usr/sbin/acpid $OPTIONS[Install]WantedBy=multi-user.target