Модифицируйте системный файл модуля, не изменяя исходный файл модуля
Я установил pimd
обслуживание посредством apt
, Это идет вверх по течению systemd
единичный файл (/lib/systemd/system/pimd.service
).
Я хочу, чтобы служба перезапускалась, когда по какой-то причине она была убита, поэтому я хочу добавить строку Restart = always
в файле модуля.
Тем не менее, я не хочу изменять файл модуля upstream.
Есть ли обходной путь для этого?
3 ответа
У вас есть два варианта:
Скопируйте файл модуля из
/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
Документация 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 по созданию и изменению системных файлов модулей
Подумайте об использовании сценария, чтобы прочитать исходную конфигурацию, изменить ее и выложить в раскрывающийся файл.
Например, я использую Chef, и вот часть ruby (библиотеки), которая анализирует файл systemd модуля marathon, чтобы получить из него оригинальный 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