我正在尝试将 init 脚本重写为 systemd,但我正在努力解决可选依赖项的问题。
我的服务(可选)依赖于其他两项服务。这两个依赖项是互斥的(服务器包和客户端包)——一次只能安装一个,并且可以完全缺失。
如果安装了任一依赖项,则该依赖项应在我的服务之前启动,如果启动失败,我的服务不应启动。
但如果这两个依赖项均未安装,我的服务应该正常启动。
我怎样才能实现这个功能?可选依赖项通过 处理Wants=
,但这会忽略错误。
答案1
如果您可以控制依赖项(即它们是您的软件),请让它们安装相关单元文件的嵌入式文件。也就是说,假设您有foo.service
which 需要依赖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
仅当提到的文件存在时,此服务才会激活您的服务。