首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以重写systemd单元文件以创建模板单元文件?

是否可以重写systemd单元文件以创建模板单元文件?
EN

Server Fault用户
提问于 2017-04-12 19:58:19
回答 1查看 5.2K关注 0票数 9

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

代码语言:javascript
复制
sudo systemctl edit <unitfile>

创建覆盖conf文件的步骤

代码语言:javascript
复制
/etc/systemd/system/<unitfile.d>/

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

代码语言:javascript
复制
<servicename>@.service

然后将其实例化为

代码语言:javascript
复制
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启动grafana-server@dev和sudo systemctl启动grafana-server@stg

但是,这会破坏grafana提供的服务单元文件中的链接,如果它们在我升级时增强了服务文件,我将需要再次进行此活动。我的目标是避免这种直接依赖,而是将其转换为覆盖依赖。

有什么想法吗?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2017-10-22 14:20:25

对于下面这两个选项,首先在/etc/systemd/system上重写grafana-server.service (没有@),并抑制ExecStart (假设它使用该选项)使其没有启动。在/etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf上:

代码语言:javascript
复制
[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir

选项1-用泛型实例重写

创建一个与您的设置相对应的grafana-server@.service,配置为[Unit][Service]

代码语言:javascript
复制
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

这些应该将grafana服务器启动/停止/重新启动绑定到所有实例。这个魔术并没有很好的文档化,但是如果您将<instance_name>.conf文件放在您的/path/to/your/confdir上,那么所有这些实例都将自动绑定!

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

如果希望保存包服务文件中的所有更新优点,但接受维护自定义实例选项,请从泛型中为每个实例名称创建一个符号链接。

代码语言:javascript
复制
/lib/systemd/system/grafana-server.service

代码语言:javascript
复制
/etc/systemd/system/grafana-service@<instance>.service

然后仅重写实例的特定选项。

代码语言:javascript
复制
/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf

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

代码语言:javascript
复制
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

这将为每个实例假定所有grafana-server.service选项,并使用99-my-options.conf文件上的所有选项覆盖它们,并将启动/停止/重新启动操作绑定到grafana-server.service。

两种选择,如果您运行

代码语言:javascript
复制
systemctl start grafana-server.service

所有具有/path/to/confdir/<instance>.conf文件的实例都将被启动。同样的情况也适用于stoprestart,您总是可以通过使用它们的grafana-server@<instance>服务名称来单独管理它们。

票数 6
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/844202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档