Я знаю, что systemd предоставляет отличный механизм для переопределения файла модуля, предоставленного пакетом, чтобы повлиять на конфигурацию / поведение службы. Обычно это делается с помощью следующей команды
sudo systemctl edit <unitfile>
для создания файла конфигурации переопределения в
/etc/systemd/system/<unitfile.d>/
Systemd также предоставляет отдельный механизм для определения файла модуля шаблона и его экземпляра для создания модулей, зависящих от экземпляра, во время выполнения. Для этого необходимо назвать файл шаблона как
<servicename>@.service
а затем создав его как
systemctl start <servicename>@<instancename>
Теперь у меня есть ситуация, когда я хотел бы запустить сервис, предоставляемый пакетом, как несколько экземпляров единицы. Я хочу избежать создания собственного файла модуля шаблона, поэтому я пытаюсь проверить, можно ли переопределить предоставленный пакетом файл модуля для создания файла модуля шаблона.
Поскольку, насколько я понимаю, у файла модуля шаблона есть соглашение об именах, которое отличается от обычного файла модуля, я думаю, что я не могу переопределить предоставленный пакетом файл модуля файлом шаблона, поместив его в / etc / systemd / system.
Есть ли какой-нибудь определенный способ достичь того, что я пытаюсь сделать?
Конкретный сценарий: пакет grafana устанавливает единичный файл grafana-server.service. Я хочу запустить на моей машине два экземпляра графаны - по одному для DEV и STG. Мне удалось это сделать:
запускать экземпляры графаны с помощью:
sudo systemctl start grafana-server@dev
и
sudo systemctl start grafana-server@stg
Однако это разрывает ссылку из предоставленного grafana файла служебной единицы, и если они улучшают служебный файл при обновлении, мне нужно будет повторить это действие снова. Моя цель - избежать этой прямой зависимости и вместо этого преобразовать ее в замещающую зависимость.
Есть предположения?
Для обоих вариантов ниже сначала переопределите grafana-server.service (без @) на /etc/systemd/system
и подавить ExecStart
(предположим, он использует это), чтобы ничего не запускать. На /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf
:
[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir
Создать grafana-server@.service
который соответствует вашим настройкам со следующей конфигурацией для [Unit]
и [Service]
:
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Они должны связать запуск / остановку / перезапуск графана-сервера со всеми вашими экземплярами вместе. В магия не очень хорошо документирован, но если вы положите <instance_name>.conf
файлы на вашем /path/to/your/confdir
, все эти экземпляры будут связаны автоматически!
Если вы хотите сохранить все обновить добро из служебного файла пакета, но согласитесь с сохранением параметров пользовательских экземпляров, создайте символическую ссылку для каждого имени экземпляра из общего
/lib/systemd/system/grafana-server.service
к
/etc/systemd/system/grafana-service@<instance>.service
а затем переопределить только определенные параметры этого экземпляра, используя
/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf
Обязательно добавьте следующую конфигурацию в [Unit]
и [Service]
к 99-my-options.conf
:
[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service
Это будет предполагать для каждого экземпляра все grafana-server.service
параметры и переопределит их со всеми параметрами на 99-my-options.conf
file, а также привязать действия start / stop / restart к grafana-server.service.
В обоих вариантах, если вы запустите
systemctl start grafana-server.service
все ваши экземпляры, у которых есть /path/to/confdir/<instance>.conf
файл будет запущен. То же самое относится к stop
и restart
И вы всегда можете управлять ими индивидуально, используя их grafana-server@<instance>
наименование услуги.