Я установил pimd
обслуживание посредством apt
. Это идет с восходящим потоком systemd
единичный файл (/lib/systemd/system/pimd.service
).
Я хочу, чтобы служба была перезапущена, когда по какой-то причине она будет убита, поэтому я хочу добавить строку Restart = always
в файле модуля.
Однако я не хочу изменять исходный файл модуля.
Есть ли обходной путь для этого?
У вас есть два варианта:
Скопируйте файл модуля из /lib/systemd/system/
к /etc/systemd/system/
.
А затем внесите свои изменения в /etc/systemd/system/pimd.service
чтобы полностью переопределить файл (ы) модуля, предоставленный сопровождающим пакета.
Команда systemctl edit --full <service-name>
автоматизирует это для вас.
Вы можете изменить или добавить определенные параметры конфигурации для объекта, не изменяя файлы объекта, создавая .conf
файлы в папке drop-in /etc/systemd/system/<unit-name>.<unit-type>.d/
т.е. создать /etc/systemd/system/pimd.service.d/restart.conf
Команда systemctl edit <service-name>
выполняет эти шаги за вас.
Видеть man systemd.unit
В документации 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
после внесения изменений.
Документация RHEL по созданию и изменению файлов модулей systemd
Рассмотрите возможность использования сценария для чтения конфигурации восходящего потока, изменения ее и вывода ее в файл drop-in.
Например, я использую Chef, и вот кусок рубина (библиотеки), который анализирует файл модуля 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
Затем в рецепте я создаю файл drop-in, чтобы добавить параметр в 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