systemd 将服务添加到 multi-user.target.wants 文件夹中仅用作符号链接
systemd adding service into multi-user.target.wants folder only works as a symlink
我一直在添加一些系统服务。我开始使用我的服务是来自以下的符号链接:
/etc/systemd/system/multi-user.target.wants/myservice.service -> /home/myservice.service
这似乎工作正常。但如果我删除符号链接并将其设为具体文件,则服务不会加载(systemctl daemon-reload
找不到它)。
但是,如果我将服务移至 /etc/systemd/system/myservice.service
,则它工作正常。
因此,看来要使服务在 multi-user.target.wants 中工作,它需要是一个符号链接。这是为什么?有解决办法吗?
我之前在 multi-user.target.wants 中看到过指向 ../myservice.service
的符号链接...我猜我无意中发现了其中的原因!?
在 .wants/
和 .requires/
目录中只允许符号链接。根据习惯,符号链接指向 /etc/systemd/system/
、/usr/lib/systemd/system/
或其他单元目录之一中的实际单元文件。但是 systemd 并不太关心符号链接目标。 (符号链接的目标目录被完全忽略。检查符号链接目标的最终组件,如果目标名称与符号链接名称不匹配,较新的 systemd 将发出警告,但仍会接受它)。符号链接的存在表明需要创建 Wants 或 Requires 依赖项。
.wants/
和 .requires/
目录是一种声明依赖关系的机制。但是要实际加载单元,systemd 需要找到单元文件。它需要位于目录之一(/etc/systemd/system/
、/usr/lib/systemd/system/
等)。
您可能会对以下事实感到困惑:旧的 systemd 会遵循来自 .wants/
或 .requires/
的单元符号链接并加载单元文件。这是有问题的,原因有两个:首先是 systemd 对目录有优先顺序,它应该加载优先级最高的目录中的单元文件。但是符号链接可能指向优先级较低的目录中的单元文件。为了保持一致,systemd 必须忽略符号链接目标,并按顺序搜索目录。第二个原因是符号链接可能指向搜索路径之外的文件。如果 systemd 允许加载此类单元,则这些单元可以作为另一个单元的依赖项加载,但是当要求直接加载该单元时,systemd 将无法找到它。较新的 systemd 从不遵循此类符号链接。
上一段中的第二个原因也是为什么 systemd 不允许 .wants/
或 .requires/
中的真实文件:该单元只能作为另一个单元的依赖项加载,而不是直接加载.
有两种正确的处理方法:
- 将单元文件移动到单元目录之一,例如
/etc/systemd/system/myservice.service
,以及从 multi-user.target.wants/
. 到它的符号链接
- 将单元文件保存在其他地方,例如
~/myservice.service
,以及从单元目录之一指向它的符号链接,例如/etc/systemd/system/myservice.service
,以及从 multi-user.target.wants/
. 到该符号链接的符号链接
另请参阅 systemctl link
和 systemctl enable
,它们可以为您创建这些符号链接。
我一直在添加一些系统服务。我开始使用我的服务是来自以下的符号链接:
/etc/systemd/system/multi-user.target.wants/myservice.service -> /home/myservice.service
这似乎工作正常。但如果我删除符号链接并将其设为具体文件,则服务不会加载(systemctl daemon-reload
找不到它)。
但是,如果我将服务移至 /etc/systemd/system/myservice.service
,则它工作正常。
因此,看来要使服务在 multi-user.target.wants 中工作,它需要是一个符号链接。这是为什么?有解决办法吗?
我之前在 multi-user.target.wants 中看到过指向 ../myservice.service
的符号链接...我猜我无意中发现了其中的原因!?
在 .wants/
和 .requires/
目录中只允许符号链接。根据习惯,符号链接指向 /etc/systemd/system/
、/usr/lib/systemd/system/
或其他单元目录之一中的实际单元文件。但是 systemd 并不太关心符号链接目标。 (符号链接的目标目录被完全忽略。检查符号链接目标的最终组件,如果目标名称与符号链接名称不匹配,较新的 systemd 将发出警告,但仍会接受它)。符号链接的存在表明需要创建 Wants 或 Requires 依赖项。
.wants/
和 .requires/
目录是一种声明依赖关系的机制。但是要实际加载单元,systemd 需要找到单元文件。它需要位于目录之一(/etc/systemd/system/
、/usr/lib/systemd/system/
等)。
您可能会对以下事实感到困惑:旧的 systemd 会遵循来自 .wants/
或 .requires/
的单元符号链接并加载单元文件。这是有问题的,原因有两个:首先是 systemd 对目录有优先顺序,它应该加载优先级最高的目录中的单元文件。但是符号链接可能指向优先级较低的目录中的单元文件。为了保持一致,systemd 必须忽略符号链接目标,并按顺序搜索目录。第二个原因是符号链接可能指向搜索路径之外的文件。如果 systemd 允许加载此类单元,则这些单元可以作为另一个单元的依赖项加载,但是当要求直接加载该单元时,systemd 将无法找到它。较新的 systemd 从不遵循此类符号链接。
上一段中的第二个原因也是为什么 systemd 不允许 .wants/
或 .requires/
中的真实文件:该单元只能作为另一个单元的依赖项加载,而不是直接加载.
有两种正确的处理方法:
- 将单元文件移动到单元目录之一,例如
/etc/systemd/system/myservice.service
,以及从multi-user.target.wants/
. 到它的符号链接
- 将单元文件保存在其他地方,例如
~/myservice.service
,以及从单元目录之一指向它的符号链接,例如/etc/systemd/system/myservice.service
,以及从multi-user.target.wants/
. 到该符号链接的符号链接
另请参阅 systemctl link
和 systemctl enable
,它们可以为您创建这些符号链接。