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

Я установил 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 рекомендует два способа:

  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 по созданию и изменению системных файлов модулей

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

Например, я использую 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
Другие вопросы по тегам