首页 > 解决方案 > systemd 将服务添加到 multi-user.target.wants 文件夹仅用作符号链接

问题描述

我一直在添加一些系统服务。我的服务是从以下符号链接开始的:

/etc/systemd/system/multi-user.target.wants/myservice.service -> /home/myservice.service

这似乎工作正常。但是如果我删除符号链接并使其成为一个具体文件,则该服务不会加载(systemctl daemon-reload找不到它)。

但是,如果我将服务移入,/etc/systemd/system/myservice.service那么它工作正常。

因此,对于要在 multi-user.target.wants 中工作的服务,它似乎需要是一个符号链接。这是为什么?有办法解决吗?

../myservice.service之前在 multi-user.target.wants 中看到过符号链接......我猜我偶然发现了原因!?

标签: linuxsystemd

解决方案


.wants/.requires/目录中只允许使用符号链接。通过自定义,符号链接将指向 、 或其他单元目录之一中的实际单元/etc/systemd/system/文件/usr/lib/systemd/system/。但是 systemd 并不太关心符号链接目标。(符号链接的目标目录被完全忽略。符号链接目标的最后一个组件被检查,如果目标名称与符号链接名称不匹配,较新的 systemd 会发出警告,但仍会接受它)。符号链接的存在表明需要创建 Wants 或 Requires 依赖项。

.wants/.requires/目录是一种声明依赖的机制。但要实际加载单元,systemd 需要找到单元文件。它需要位于目录之一(/etc/systemd/system//usr/lib/systemd/system/等)中。

.wants/您可能会因为旧的 systemd 会遵循来自或.requires/加载单元文件的单元符号链接这一事实而感到困惑。这是有问题的,原因有两个:首先,systemd 对目录有优先顺序,并且它应该将单元文件加载到具有最高优先级的目录中。但是符号链接可能指向优先级较低的目录中的单元文件。为了保持一致,systemd 必须忽略符号链接目标,并按顺序搜索目录。第二个原因是符号链接可能指向搜索路径之外的文件。如果 systemd 允许加载此类单元,则这些单元可以作为另一个单元的依赖项加载,但是当被要求直接加载该单元时,systemd 将无法找到它。较新的 systemd 从不遵循这样的符号链接。

上一段中的第二个原因也是为什么 systemd 不允许在.wants/or中使用真实文件.requires/:该单元只能作为另一个单元的依赖项加载,但不能直接加载。

有两种正确的处理方法:

  1. 将单元文件移动到单元目录之一,例如/etc/systemd/system/myservice.service,并从 符号链接到它multi-user.target.wants/
  2. 将单元文件保存在其他位置,例如~/myservice.service,并从单元目录之一符号链接到它,例如/etc/systemd/system/myservice.service,并从 符号链接到该符号链接multi-user.target.wants/

另请参阅systemctl linksystemctl enable哪些可以为您创建这些符号链接。


推荐阅读