Модифицируйте системный файл модуля, не изменяя исходный файл модуля


24

Я установил pimdсервис с помощью apt. Это идет с исходным systemdмодульным файлом ( /lib/systemd/system/pimd.service).

Я хочу, чтобы служба перезапускалась, когда по какой-то причине она была убита, поэтому я хочу добавить строку Restart = alwaysв файл модуля.

Тем не менее, я не хочу изменять файл модуля upstream.

Есть ли обходной путь для этого?



Что ты пробовал?
030

Ответы:


35

У вас есть два варианта:

  • Скопируйте файл модуля из /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


10
Второй вариант можно упростить с помощьюsystemctl edit <service-name>
Muru

7
И первый с помощью systemctl edit --full <service-name>.
Гравитация

22

Документация 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после внесения изменений.

Документация RHEL по созданию и изменению системных файлов модулей


0

Подумайте об использовании сценария, чтобы прочитать исходную конфигурацию, изменить ее и выложить в раскрывающийся файл.

Например, я использую 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.