我想通过将.service
文件放入/etc/systemd/system
.我的源.service
文件位于/opt/something.service
.
安装时我有两个选择:
cp /opt/something.service /etc/systemd/system
ln -s /opt/something.service /etc/systemd/system
当我start
和enable
服务(服务正常工作)时,这两种方法都有效。
然而,禁用该服务时存在差异:
- 在副本的情况下,
/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
按预期工作。