是否可以重写一个systemd单元文件来创build一个模板单元文件?

我知道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-server.service文件(使用%I设置文件夹位置和文件path)
  • 将修改后的grafana-server.service重命名为grafana-server @ .service
  • 使用以下命令启动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 

选项1 – 覆盖一般的实例

使用以下configuration创build与您的设置对应的[email protected][Unit][Service]

 [Unit] PartOf=grafana-server.service ReloadPropagatedFrom=grafana-server.service 

这些应该绑定grafana服务器启动/停止/重新启动到所有您的实例一起。 神奇的是没有很好的logging,但是如果你把<instance_name>.conf文件放在你的/path/to/your/confdir ,所有这些实例都将被自动绑定!

选项2 – 覆盖特定的实例来保持包configuration

如果您希望从包服务文件中保留所有更新的好处 ,但接受主要的自定义实例选项,请为通用的每个实例名称创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文件的实例将被启动。 这同样适用于stoprestart ,您可以随时使用它们的grafana-server@<instance>服务名称单独pipe理它们。