Назад | Перейти на главную страницу

Изменить файл модуля systemd без изменения файла модуля восходящего потока

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

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