屏蔽并继承相同的systemd单元

屏蔽并继承相同的systemd单元

假设一个包提供了whatever.service 文件,因此某些事件(包括whatever.socket)会导致守护进程以某种配置启动。

我想完全禁用这个功能。特别是,我希望旧套接字和可能通过名称引用此服务的任何其他单元文件无法启动守护程序。

相反,我想使用不同的 .socket 单元和不同的环境变量为此守护程序创建自己的单元文件。我还希望我的覆盖自动考虑到原始单元文件可能的上游更新(不幸的是,我当前的将whatever.service复制为whatever-modified.service并编辑它的解决方案没有提供)。

如果我创建以下符号链接和文件:
/etc/systemd/system/whatever.service → /dev/null
/etc/systemd/system/whatever-modified.service → /usr/lib/systemd/system/whatever.service
/等/systemd/system/whatever-modified.service.d/fix.conf

systemd 认为新服务也被屏蔽并拒绝启动它。如何避免这种情况?

答案1

如果您创建/etc/systemd/system/whatever.service,它已经自动且完全覆盖任何相应的/usr/lib/systemd/system/whatever.service- 符号链接/dev/null只是其中的一个特例。

如果您只想覆盖现有的部分内容/usr/lib/systemd/system/whatever.service,考虑到未来可能的更新,您可以/etc/systemd/system/whatever.service.d/fix.conf使用覆盖/添加进行创建。/usr/lib/systemd/system/whatever.service如果/etc/systemd/system/whatever.service不存在,它将自动应用。

请注意,某些设置(例如,ExecStart=可能会出现多次),如果您希望覆盖现有ExecStart=行而不是添加另一行,则fix.conf需要如下所示:

[Service]
ExecStart=
ExecStart=/your/custom/command

第一个空ExecStart=行告诉 systemd“我想删除原来的 ExecStart 参数,而不仅仅是添加一个新参数。”

当然,请记住始终systemctl daemon-reload在更改.service文件或.service.d目录或其内容后运行。否则更改将不会生效。

systemctl cat whatever.service通过立即显示最终构建服务定义的所有部分,运行可能会有所帮助。

相关内容