我知道 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 提供的服务单元文件的链接,如果他们在我升级时增强了服务文件,我将需要再次重做此活动。我的目标是避免这种直接依赖,而是将其转换为覆盖依赖。
有什么想法吗?
对于下面的两个选项,首先覆盖 grafana-server.service(不带@)/etc/systemd/system并抑制ExecStart(假设它使用它)使其不启动。在/etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:
[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir
Run Code Online (Sandbox Code Playgroud)
grafana-server@.service使用以下配置创建与您的设置相对应的[Unit]和[Service]:
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Run Code Online (Sandbox Code Playgroud)
这些应该将 grafana-server start/stop/restart 绑定到所有实例。这个魔法没有很好的文档记录,但是如果你把<instance_name>.conf文件放在你的/path/to/your/confdir,所有这些实例都将自动绑定!
如果您想保留包服务文件中的所有更新优点,但接受维护自定义实例选项,请为通用的每个实例名称创建一个符号链接
/lib/systemd/system/grafana-server.service
Run Code Online (Sandbox Code Playgroud)
到
/etc/systemd/system/grafana-service@<instance>.service
Run Code Online (Sandbox Code Playgroud)
然后使用仅覆盖该实例的特定选项
/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf
Run Code Online (Sandbox Code Playgroud)
请确保以下配置增加[Unit]和[Service]到99-my-options.conf:
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Run Code Online (Sandbox Code Playgroud)
这将为每个实例假定所有grafana-server.service选项,并将使用99-my-options.conf文件中的所有选项覆盖它们,并将启动/停止/重启操作绑定到 grafana-server.service。
在这两个选项上,如果您运行
systemctl start grafana-server.service
Run Code Online (Sandbox Code Playgroud)
/path/to/confdir/<instance>.conf将启动所有具有文件的实例。这同样适用于stop和restart,并且您始终可以使用其grafana-server@<instance>服务名称单独管理它们。
| 归档时间: |
|
| 查看次数: |
4097 次 |
| 最近记录: |