Змініть файл системного блоку, не змінюючи файл модуля


24

Я встановив pimdслужбу за допомогою apt. Це постачається з systemdфайлом модуля верхньої частини ( /lib/systemd/system/pimd.service).

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

Однак я не хочу змінювати файл верхніх модулів.

Чи є якесь рішення для цього?



Що ви спробували?
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>.
grawity

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

Подумайте про використання сценарію для читання конфігурації вище, модифікуйте її та випустіть її до випадаючого файлу.

Наприклад, я використовую шеф-кухаря, і ось фрагмент рубіна (бібліотека), який аналізує системний блок марафону, щоб отримати з нього оригінальний 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.