为什么禁用服务时链接会被删除? (文件不是)

为什么禁用服务时链接会被删除? (文件不是)

我想通过将.service文件放入/etc/systemd/system.我的源.service文件位于/opt/something.service.

安装时我有两个选择:

  • cp /opt/something.service /etc/systemd/system
  • ln -s /opt/something.service /etc/systemd/system

当我startenable服务(服务正常工作)时,这两种方法都有效。

然而,禁用该服务时存在差异:

  • 在副本的情况下,/etc/systemd/system/something.service仍然
  • 在链接的情况下,/etc/systemd/system/something.service被删除

这是设计使然吗?这非常烦人,因为在禁用通过链接创建的服务后,这还不够enable- 还必须重新创建服务单元。

答案1

是的,这是设计使然。

的手册页systemctl disable说:

禁用一个或多个单元。这将从单元配置目录中删除指向指定单元文件的所有符号链接,从而撤消启用所做的更改。但请注意,这会删除单元文件的所有符号链接(即包括手动添加),而不仅仅是启用实际创建的符号链接。

这是它的链接:https://www.freedesktop.org/software/systemd/man/systemctl.html#

它没有解释原因,但我可以大胆猜测它无法区分使用创建的链接systemctl enable和手动创建的链接,因为它正在寻找指向单元文件的链接。

link当您创建指向 systemd 搜索路径之外的源文件的符号链接时,应该使用systemctl 中的选项。也来自同一手册页。

链接文件名...

将不在单元文件搜索路径中的单元文件链接到单元文件搜索路径中。这需要单元文件的绝对路径。可以通过禁用来撤销此效果。该命令的作用是单元文件可用于启动和其他命令,尽管它没有直接安装在单元搜索路径中。

答案2

我不确定您正在使用的发行版,但我将从 RHEL 7 开始(因为这就是我正在使用的发行版,并且应该类似)。

systemd/usr/lib/systemd/system/*.service通常在(您可以查看其他服务链接以了解您的发行版)中查找服务文件

要启用服务,它应该有一个[install]部分,并且在安装部分内它应该有一个WantedBy=标签。这WantedBy指定了在什么条件下应启用它(例如运行级别)。应该WantedBy匹配 中的目录/etc/systemd/system/*.target.wants

然后,如果启用该服务,则会创建一个链接以/etc/systemd/system/*.target.wants/指向/usr/lib/systemd/system/.禁用该服务也只会删除该链接。

例如,如果您有一个服务文件 (test.service),其中包括:

[install]
WantedBy=multi-user.target

然后:

systemctl enable test.service

会在里面创建一个链接

/etc/systemd/system/multi-user.target.wants/

称为test.service指向/usr/lib/systemd/system/test.service

禁用该服务只会删除链接。

答案3

您必须有已启用的服务的链接。拥有真实文件是一种不好的做法,因为该文件夹的目的是允许您禁用或启用服务,而不是将其脚本保存在其中。

答案4

一种解决方法是使用 systemd 不会删除符号链接的目录。

对于系统链接:/usr/local/lib/systemd/system/

对于用户链接: ~/.config/systemd/user.control/usr/local/lib/systemd/user/

将您的符号链接放入上述目录中。systemctl disable接下来是systemctl enable按预期工作。

相关内容