systemd将服务添加到multi-user.target.wants文件夹中,只能通过符号链接来实现。

8

我一直在添加一些 systemd 服务。最开始,我的服务是从以下位置作为符号链接启动的:

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

这似乎可以正常工作。但是,如果我删除符号链接并将其变成具体文件,则服务不会加载(systemctl daemon-reload找不到它)。
然而,如果我把服务移动到/etc/systemd/system/myservice.service中,那么它就能正常工作。
因此,似乎对于在multi-user.target.wants中工作的服务,它需要是一个符号链接。为什么是这样的?有没有办法绕过这个问题?
我以前见过多用户.target.wants中的符号链接到../myservice.service...我猜我已经发现了原因!

@Rob 你可能是对的,那是我的错误 - 我习惯使用 so。但同时,感谢你花时间解释 - 这种情况发生得太少了 : ) 顺便问一下 - 我能移动这个问题吗(因为 zbyszek 已经费心回答了,我不想剥夺他们的积分)?- 我也会投票关闭它以完成它 :o - code_fodder
我不知道。你可以在 https://meta.stackoverflow.com/ 上询问,那里的管理员可能会帮助你。 - Rob
1个回答

14

.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/中使用真实文件的原因:该单元只能作为另一个单元的依赖项加载,而不能直接加载。
处理此问题的两种正确方法如下:
  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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接