我知道systemd提供了一个很好的机制来覆盖包提供的单元文件来影响服务configuration/行为。 这通常通过使用下面的命令完成
sudo systemctl edit <unitfile>
创build覆盖conf文件
/etc/systemd/system/<unitfile.d>/
Systemd还提供了一个单独的机制来定义一个模板单元文件,并将其实例化为在运行时创build特定于实例的单元。 这需要将模板文件命名为
<servicename>@.service
然后将其实例化为
systemctl start <servicename>@<instancename>
现在,我有一种情况,我想将包提供的服务作为多个单元实例运行。 我想避免创build自己的模板单元文件,所以我想看看是否可以重写包提供的单元文件来创build模板单元文件。
因为根据我的理解,模板单元文件的命名约定与常规单元文件不同,所以我认为我不能用模板文件将其放在/ etc / systemd / system中来覆盖软件包提供的单元文件。
有没有什么明确的方法来实现我想要做的?
具体场景:grafana包安装一个grafana-server.service单元文件。 我想在我的机器上运行grafana的两个实例 – DEV和STG各一个。 我已经能够做到这一点:
使用以下命令启动Grafana的实例:
sudo systemctl start grafana-server@dev
和
sudo systemctl start grafana-server@stg
但是,这将从Grafana提供的服务单元文件中断开连接,如果在升级时增强了服务文件,则需要重新执行此活动。 我的目标是避免这种直接的依赖,而是将其转换为重写依赖。
有什么想法吗?
对于下面的两个选项,首先覆盖/etc/systemd/system上的grafana-server.service(不带@),并禁止ExecStart (假设它使用它)使它不能启动。 在/etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf :
[Service] ExecStart= WorkingDirectory=/path/to/your/confdir
使用以下configuration创build与您的设置对应的[email protected]到[Unit]和[Service] :
[Unit] PartOf=grafana-server.service ReloadPropagatedFrom=grafana-server.service
这些应该绑定grafana服务器启动/停止/重新启动到所有您的实例一起。 神奇的是没有很好的logging,但是如果你把<instance_name>.conf文件放在你的/path/to/your/confdir ,所有这些实例都将被自动绑定!
如果您希望从包服务文件中保留所有更新的好处 ,但接受主要的自定义实例选项,请为通用的每个实例名称创build一个符号链接
/lib/systemd/system/grafana-server.service
至
/etc/systemd/system/grafana-service@<instance>.service
然后只覆盖该实例使用的特定选项
/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf
确保将以下configuration添加到[Unit]和[Service]到99-my-options.conf :
[Unit] PartOf=grafana-server.service ReloadPropagatedFrom=grafana-server.service
这将为每个实例假定所有的grafana-server.service选项,并将用99-my-options.conf文件中的所有选项覆盖它们,并将启动/停止/重新启动操作绑定到grafana-server.service。
在两个选项上,如果你运行
systemctl start grafana-server.service
你所有的具有/path/to/confdir/<instance>.conf文件的实例将被启动。 这同样适用于stop和restart ,您可以随时使用它们的grafana-server@<instance>服务名称单独pipe理它们。