我已经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>
为您执行这些步骤。
答案2
RHEL文档推荐了两种方法:
- 通过创建配置目录和文件来扩展默认单元文件
/etc/systemd/system/[name-goes-here].service.d/config_name.conf
在这种情况下,文件需要包含如下内容:
[Service]
Restart=always
它systemctl edit [name-goes-here]
所做的就是创建该目录并override.conf
在其中进行操作。
-
创建原始单元文件的副本并
/usr/lib/systemd/system/
在/etc/systemd/system/
那里进行更改。
我会尝试选项一,但它们都是可行的选择。无论哪种方式,请记住systemctl daemon-reload
在进行更改后运行。
答案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