例子:

例子:

我正在尝试将 init 脚本重写为 systemd,但我正在努力解决可选依赖项的问题。

我的服务(可选)依赖于其他两项服​​务。这两个依赖项是互斥的(服务器包和客户端包)——一次只能安装一个,并且可以完全缺失。

如果安装了任一依赖项,则该依赖项应在我的服务之前启动,如果启动失败,我的服务不应启动。

但如果这两个依赖项均未安装,我的服务应该正常启动。

我怎样才能实现这个功能?可选依赖项通过 处理Wants=,但这会忽略错误。

答案1

如果您可以控制依赖项(即它们是您的软件),请让它们安装相关单元文件的嵌入式文件。也就是说,假设您有foo.servicewhich 需要依赖bar.service || baz.service.

然后该包可以安装包含以下内容的bar文件:/usr/lib/systemd/system/foo.service.d/50-bar-baz.conf

[Unit]
Requires=bar.service

对于包来说也是如此baz


如果您无法控制依赖项,则只需创建一个“调度程序”脚本来检查单元文件是否存在,然后exec systemctl start对所选单元文件执行操作。然后编写一个单独的单元,并在主单元后面添加 require/:

[Unit]
# inexistent unit names are ignored here
After=bar.service baz.service

[Service]
Type=oneshot
ExecStart=/path/to/dispatcher

答案2

您可以使用 systemd 路径单元。您的服务文件应该有相应的路径单元来检查路径/文件是否存在。

例子:

service.path
[Unit]
Description:Service description

[Path]
PathExists=!/other/service/binary/path/or/some/other/file/from/that/package

[Install]
WantedBy=some-user.target

仅当提到的文件存在时,此服务才会激活您的服务。

相关内容