linux – 是否可以覆盖systemd单元文件来创建模板单元文件?

我知道systemd提供了一种优秀的机制来覆盖包提供的单元文件以影响服务配置/行为.这通常通过使用以下命令来完成

sudo systemctl edit <unitfile>

在.创建一个覆盖conf文件

/etc/systemd/system/<unitfile.d>/

Systemd还提供了一个单独的机制来定义模板单元文件,并将其实例化以在运行时创建特定于实例的单元.这需要将模板文件命名为

<servicename>@.service

然后将其实例化为

systemctl start <servicename>@<instancename>

现在,我有一种情况,我想将一个包提供的服务作为多个单元实例运行.我想避免创建自己的模板单元文件,所以我试图查看是否可以覆盖包提供的单元文件来创建模板单元文件.

因为,根据我的理解,模板单元文件的命名约定与常规单元文件不同,我想我不能通过将模板文件放在/ etc / systemd / system中来覆盖包提供的单元文件.

是否有任何明确的方法来实现我想要做的事情?

具体情况:
grafana包安装了一个grafana-server.service单元文件.我想在我的机器上运行两个grafana实例 – 一个用于DEV和STG.我能够做到这一点:

>修改grafana-server.service文件(使用%I设置文件夹位置和文件路径)
>将修改后的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 – 覆盖通用实例

使用以下配置创建一个与您的设置对应的grafana-server @ .service到[Unit]和[Service]:

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

这些应该将grafana-server启动/停止/重启绑定到所有实例.魔术没有很好的记录,但是如果你将/ lt; instance_name> .conf文件放在/ path /到/ your / confdir上,那么所有这些实例都将自动绑定!

选项2 – 覆盖特定实例以保持包配置

如果要保持包服务文件中的所有更新优点,但接受主要自定义实例选项,请为通用名称创建每个实例名称的符号链接

/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

确保将以下配置添加到[Unit]和[Service]到99-my-options.conf:

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

这将为每个实例假设所有grafana-server.service选项,并将使用99-my-options.conf文件中的所有选项覆盖它们,并将start / stop / restart操作绑定到grafana-server.service.

如果您运行,请在两个选项上

systemctl start grafana-server.service

将启动所有具有/path/to/confdir/\u0026lt;instance\u0026gt;.conf文件的实例.这同样适用于停止和重新启动,您可以使用他们的grafana-server @< instance>单独管理它们.服务名称.

转载注明原文:linux – 是否可以覆盖systemd单元文件来创建模板单元文件? - 代码日志