修改 systemd 单元文件而不改变上游单元文件

修改 systemd 单元文件而不改变上游单元文件

我已经pimd通过 安装了该服务apt。它附带一个上游systemd单元文件(/lib/systemd/system/pimd.service)。

我希望当服务由于某种原因被终止时能够重新启动它,因此我希望Restart = always在单元文件中添加该行。

但是,我不想修改上游单元文件。

有没有什么办法可以解决这个问题?

答案1

您有两个选择:

  • 将单元文件从 复制/lib/systemd/system//etc/systemd/system/
    然后在 中进行修改/etc/systemd/system/pimd.service以完全覆盖软件包维护者提供的单元文件。

    命令systemctl edit --full <service-name>为您实现自动化。

  • 您可以更改或添加单元的特定配置设置,而无需通过.conf在插入目录中创建文件 来修改单元文件/etc/systemd/system/<unit-name>.<unit-type>.d/
    ,即创建/etc/systemd/system/pimd.service.d/restart.conf

    命令systemctl edit <service-name>为您执行这些步骤。

man systemd.unit

答案2

RHEL文档推荐了两种方法:

  1. 通过创建配置目录和文件来扩展默认单元文件/etc/systemd/system/[name-goes-here].service.d/config_name.conf

在这种情况下,文件需要包含如下内容:

[Service]
Restart=always

systemctl edit [name-goes-here]所做的就是创建该目录并override.conf在其中进行操作。

  1. 创建原始单元文件的副本并/usr/lib/systemd/system//etc/systemd/system/那里进行更改。

我会尝试选项一,但它们都是可行的选择。无论哪种方式,请记住systemctl daemon-reload在进行更改后运行。

有关创建和修改 systemd 单元文件的 RHEL 文档

答案3

考虑使用脚本读取上游配置、修改它并将其输出到插入文件中。

例如,我使用 Chef,这里有一个 ruby​​(库),可以解析 marathon systemd 单元文件,从中获取原始 ExecStart

require 'inifile'

module Dcos
  def get_execstart_from_unit_file
    marathon_systemd_unit_file = 
    IniFile.load('/etc/systemd/system/dcos-marathon.service')
    return marathon_systemd_unit_file['Service']['ExecStart']
  end
end

然后在配方中,我创建了一个插入文件,将一个选项附加到 ExecStart

chef_gem 'inifile'

exec_start_orig = get_execstart_from_unit_file

systemd_service_drop_in 'dcos-marathon' do
  override 'dcos-marathon.service'
  precursor 'Service' => { 'ExecStart' => nil }
  service do
    exec_start exec_start_orig + ' --env_vars_prefix "DCOS_MARATHON_"'
  end
end

相关内容