Вопрос или проблема
Могу ли я перезагрузить один файл юнита/службы systemd после его изменения (в секции [Service]), не перезагружая все файлы юнитов? По онлайн-поиску все говорят о systemctl daemon-reload
или systemctl --user daemon-reload
. Это заставляет меня чувствовать себя очень плохо. Я просто хочу перезагрузить конфигурацию одного файла юнита, а не многих. Возможно ли перезагрузить только измененный файл в systemd? Большое спасибо.
systemctl daemon-reload
не может быть запущен для одного файла юнита. Что он делает, так это перезагрузка конфигураций systemd
файлов юнитов, повторный запуск всех генераторов и воссоздание дерева зависимостей.
Я полагаю, что поскольку дерево зависимостей регенерируется, нет смысла запускать это для одного юнита, так как несколько файлов юнитов могли быть изменены, и тогда дерево зависимостей может быть неправильным.
Хотя вы не можете перезагрузить один файл, systemd-run
может удовлетворить ваши нужды.
Ответ или решение
К сожалению, в службе Systemd нет возможности перезагрузить только один конфигурационный файл юнита после его изменения без выполнения команды systemctl daemon-reload
, которая обновляет все юнит-файлы. Это вызвано тем, что Systemd управляет зависимостями между юнитами и генераторами, и для сохранения целостности этих зависимостей необходимо перезагружать всю систему юнитов.
Почему systemctl daemon-reload
не может работать с отдельными юнитами
Когда вы вносите изменения в юнит-файл, такие как настройки в секции [Service]
, Systemd не отслеживает изменения в индивидуальных юнитах. Вместо этого, команда systemctl daemon-reload
инициирует полную проверку всех юнитов, создает новое дерево зависимостей и перезапускает генераторы. Это необходимо для поддержания согласованности всей системы, поэтому попытка обновления только одного юнита логически не имеет смысла.
Возможные решения
-
Перезапуск юнита: Если изменения были сделаны в конкретном юните, вы можете просто перезапустить сам этот юнит, после чего изменения, сделанные в его конфигурации, будут применены:
systemctl restart имя_юнита
Однако, это приведет к остановке и повторному запуску службы, что может быть неприемлемо для некоторых критически важных приложений.
-
Использование
systemd-run
: В некоторых случаях может помочь использованиеsystemd-run
, который позволяет вам запускать новый экземпляр службы с нужными параметрами, не вмешиваясь в существующие юниты. Однако этот метод не всегда подходит для изменения конфигурации работающей службы. -
Настройка через
systemctl edit
: Если проблема заключается в том, что вы хотите внести небольшие изменения в конфигурацию юнита, вы можете использовать команду:systemctl edit имя_юнита
Это создаст.override файл, который позволит вам внести изменения, которые будут загружены в систему вместе с основным юнитом.
Заключение
К сожалению, в текущей архитектуре Systemd невозможна перезагрузка отдельных юнит-файлов без выполнения команды daemon-reload
. Глобальная перезагрузка необходима для корректного обновления зависимостей и предотвrasтили несоответствия в системе. Применение подходов, таких как перезапуск отдельных юнитов, их редактирование или использование systemd-run
, может быть решением для конкретных ситуаций.
Помните, что в большинстве случаев лучшим подходом будет качественное тестирование ваших конфигураций перед применением их на рабочей системе, чтобы минимизировать потребность в частых перезагрузках.