我知道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提供的服务单元文件的链接,并且如果它们在我升级时增强了服务文件,则需要再次重做此活动。我的目标是避免这种直接依赖性,而是将其转换为替代依赖性。
有什么想法吗?