Что делает “systemctl daemon-reload”?

Вопрос или проблема

У меня есть сервис, который внезапно остановился. Я попытался перезапустить этот сервис, но не смог, и мне предложили выполнить: systemctl daemon-reload.

Что это делает? Что такое daemon-reload?

man systemctl говорит:

daemon-reload

Перезагрузить конфигурацию менеджера systemd. Это перезапустит все генераторы (см. systemd.generator(7)), перезагрузит все файлы юнитов и воссоздаст все дерево зависимостей. Пока демон перезагружается, все сокеты, на которых systemd слушает от имени пользовательской конфигурации, останутся доступными.

Эту команду не следует путать с командой reload.

Таким образом, это, по сути, “мягкая” перезагрузка; применение измененных конфигураций из файловой системы и регенерация деревьев зависимостей.

Следовательно, systemd.generator указывает:

Генераторы — это небольшие бинарные файлы, которые находятся в /usr/lib/systemd/user-generators/ и других указанных выше директориях. systemd(1) выполняет эти бинарные файлы очень рано при загрузке и при перезагрузке конфигурации — до загрузки файлов юнитов. Генераторы могут динамически генерировать файлы юнитов или создавать символические ссылки на файлы юнитов для добавления дополнительных зависимостей, тем самым расширяя или переопределяя существующие определения. Их основная цель — динамически преобразовывать конфигурационные файлы, которые не являются нативными файлами юнитов, в нативные файлы юнитов.

Генераторы загружаются из набора путей, определенных при компиляции, указанных выше. Генераторы системы и пользователя загружаются из директорий, имена которых заканчиваются на system-generators/ и user-generators/, соответственно. Генераторы, найденные в директориях, перечисленных ранее, переопределяют те, которые имеют такие же имена в директориях, расположенных ниже в списке. Символическая ссылка на /dev/null или пустой файл может использоваться для маскировки генератора, предотвращая его выполнение. Обратите внимание, что порядок двух директорий с самым высоким приоритетом обратный по отношению к пути загрузки юнитов и генераторы в /run переопределяют те, что в /etc.

После установки новых генераторов или обновления конфигурации может быть выполнен systemctl daemon-reload. Это удалит предыдущую конфигурацию, созданную генераторами, перезапустит все генераторы и заставит systemd перезагрузить юниты с диска. См. systemctl(1) для получения дополнительной информации.

Если вы изменили /lib/systemd/system/<servicename>.service и перезапустите с помощью

systemctl restart <servicename>.service

это не загрузит новые настройки, если вы не выполните systemctl daemon-reload. Вместо этого он просто перезапустит старые кешированные настройки без изменений.

Это много раз нас подводило. Люди просто перезапускают сервис, но забывают, что это не перезагружает изменения.

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

Ответ или решение

Команда systemctl daemon-reload является важным инструментом для работы с системой инициализации Systemd, которая используется в большинстве современных дистрибутивов Linux для управления системными и пользовательскими службами. В вашем случае вам попросили выполнить эту команду после того, как служба неожиданно остановилась и не удалось снова запустить её, что позволяет предположить, что изменения в конфигурации службы не вступили в силу. Рассмотрим более подробно, что именно происходит при выполнении systemctl daemon-reload.

Теория

Команда systemctl daemon-reload выполняет перезагрузку конфигурации менеджера Systemd. Это действие обеспечивает перезагрузку всех генераторов, повторное чтение всех файлов юнитов с диска и воссоздание всей структуры зависимостей служб. Само действие не перезапускает службы, а лишь обновляет данные, которые Systemd использует для управления этими службами.

Генераторы Systemd — это небольшие исполняемые скрипты, которые динамически генерируют файлы юнитов либо создают символические ссылки на них. Это позволяет пользователям изменять конфигурации системы на уровне динамической генерации юнитов, без необходимости редактирования самих файлов юнитов непосредственно.

Пример использования

Представим ситуацию, при которой администратор системы вносит изменения в файл конфигурации службы, расположенный по адресу /lib/systemd/system/имя_службы.service. После этих изменений, чтобы система начала учитывать новую конфигурацию, необходимо обновить данные о конфигурации в памяти иерархии Systemd. Здесь и пригодится systemctl daemon-reload.

Если просто попытаться перезапустить службу с помощью systemctl restart имя_службы.service, без предварительного выполнения daemon-reload, то изменения в файле конфигурации не будут считаны. Причина в том, что Systemd продолжает использовать ранее загруженные параметры из кеша. Это одно из наиболее частых недоразумений, произошедших с администраторами систем, когда изменения кажутся неэффективными.

Применение

В реальной практике systemctl daemon-reload часто используется после следующих изменений:

  1. Обновление конфигурационных файлов: Когда изменяется конфигурация службы в одном из файлов юнитов.
  2. Добавление или удаление юнитов: Когда новые службы добавляются в систему или удаляются из неё.
  3. Обновление пакетов, связанных с Systemd: Иногда после обновлений системных пакетов требуется обновить сведения о конфигурации служб.

Если же забыть выполнить systemctl daemon-reload, могут возникнуть ситуации, когда служба не использует свежие данные конфигурации, что чревато неожиданными ошибками или нарушением работы системы. Это может быть особенно критично в производственных системах, требующих высокой доступности и надёжности.

Также важно помнить, что есть альтернативный метод — выполнение перезагрузки системы, что также обнуляет кеш Systemd и подтягивает новые конфигурации. Однако это более радикальный метод и не всегда применим в средах, где требуется высокое время безотказной работы.

Заключение

Команда systemctl daemon-reload — это неотъемлемый инструмент для администраторов систем на Linux, работающих с Systemd. Она позволяет гарантировать, что любые изменения конфигурации службы, внесенные файлово, будут корректно учтены при последующем запуске служб. Несмотря на её простоту, она играет важную роль в обеспечении стабильности и корректной работы системы. Знание и правильное применение этой команды помогает избегать ряда типичных проблем, связанных с управлением службами в Linux, и является важной практикой для поддержания системы в актуальном и исправном состоянии.

Оцените материал
Добавить комментарий

Капча загружается...