我知道 systemd 提供了一种很好的机制来覆盖包提供的单元文件以影响服务配置/行为。这通常通过使用以下命令来完成
sudo systemctl edit <unitfile>
Run Code Online (Sandbox Code Playgroud)
在以下位置创建覆盖 conf 文件
/etc/systemd/system/<unitfile.d>/
Run Code Online (Sandbox Code Playgroud)
Systemd 还提供了一种单独的机制来定义模板单元文件,并在运行时对其进行实例化以创建特定于实例的单元。这需要将模板文件命名为
<servicename>@.service
Run Code Online (Sandbox Code Playgroud)
然后将其实例化为
systemctl start <servicename>@<instancename>
Run Code Online (Sandbox Code Playgroud)
现在,我想将包提供的服务作为多个单元实例运行。我想避免创建自己的模板单元文件,所以我想看看是否可以覆盖包提供的单元文件来创建模板单元文件。
由于,根据我的理解,模板单元文件的命名约定与常规单元文件不同,我认为我无法通过将包提供的单元文件放在 /etc/systemd/system.conf 中来覆盖模板文件。
有什么明确的方法可以实现我想要做的事情吗?
具体场景:grafana 包安装了一个 grafana-server.service 单元文件。我想在我的机器上运行两个 grafana 实例——一个分别用于 DEV 和 STG。我已经能够做到这一点:
使用以下命令启动 grafana 实例:
sudo systemctl start grafana-server@dev
Run Code Online (Sandbox Code Playgroud)
和
sudo systemctl start grafana-server@stg
Run Code Online (Sandbox Code Playgroud)但是,这会断开与 grafana 提供的服务单元文件的链接,如果他们在我升级时增强了服务文件,我将需要再次重做此活动。我的目标是避免这种直接依赖,而是将其转换为覆盖依赖。
有什么想法吗?