systemd “ждет” директорию для пользовательской цели; похоже, она не работает как ожидалось

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

Я создаю “таргет” в /etc/systemd/system, который очень простой

sp-example.target

[Unit]
Description=SP Example Target

[Install]
WantedBy=multi-user.target

Затем я создаю каталог /etc/systemd/system/sp-example.target.wants. В этом каталоге я помещаю ссылку на свою службу и перезагружаю систему. Служба не запускается, но таргет запускается. Я перемещаю ссылку из каталога sp-example.target.wants в multi-user.target.wants и перезагружаю, и служба запускается.

Похоже, что каталоги “wants” не могут находиться на другом диске, который еще не смонтирован, если только systemd не будет перезагружен следующим образом после монтирования диска.

systemctl daemon-reload
systemctl restart <service>

Помещение этого в последующий скрипт rc5.d решает проблему.

Ссылка: https://serverfault.com/questions/700862/do-systemd-unit-files-have-to-be-reloaded-when-modified

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

Ваш вопрос касается системы инициализации systemd и особенности работы с "wants" директориями для пользовательских целей (targets). Ваша проблема заключается в том, что сервис, связанный с вашей целевой единицей sp-example.target, не запускается автоматически при старте системы, если он находится в директории sp-example.target.wants, которая размещена на диске, монтируемом позднее в процессе загрузки.

Вот несколько шагов и рекомендаций, которые помогут вам правильно настроить целевую единицу и ее зависимости:

  1. Проверьте структуру ваших файлов:
    Убедитесь, что файл sp-example.target и символическая ссылка на ваш сервис находятся в правильных директориях. Это должно выглядеть так:

    /etc/systemd/system/sp-example.target
    /etc/systemd/system/sp-example.target.wants/<ваш_сервис>.service
  2. Монтирование дисков:
    Поскольку ваш сервис находится на диске, который монтируется позже, это может стать причиной того, что systemd не находит вашу зависимость на момент инициализации sp-example.target. Убедитесь, что все необходимые вам диски монтируются до того, как будет выполнена цель, для которой вы создали "wants" директорию.

  3. Обновление конфигурации systemd:
    После того как диск смонтирован, вам нужно уведомить systemd о внесенных изменениях. Для этого выполните следующие команды:

    systemctl daemon-reload
    systemctl start <ваш_сервис>

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

  4. Размещение в дополнительном скрипте:
    Если вы хотите, чтобы указанные команды выполнялись автоматически после монтирования диска, можно создать простой скрипт в одном из /etc/rc5.d/ подкаталогов. Однако, если у вас есть сервис, который может управлять монтированием и загрузкой, лучше прописать зависимости корректно в самом unit-файле, используя директивы After= и Requires=.

  5. Проверка зависимостей:
    В вашем файле сервиса, возможно, вам следует добавлять зависимости, чтобы убедиться, что сервис запускается только после монтирования нужного диска. Например, если ваш диск монтируется через mount, добавьте в ваш сервис файл:

    [Unit]
    After=local-fs.target
    Requires=your-mount-point.mount
  6. Логи и отладка:
    Для получения дополнительной информации о том, что происходит при запуске и загрузке, вы можете проверить логи systemd с помощью команды:

    journalctl -xe

    Это позволит вам понять, почему сервис не был запущен.

С соблюдением этих рекомендаций, вы сможете убедиться, что ваши "wants" директории правильно работают даже с монтированием дисков, и ваши сервисы будут запускаться автоматически, как только все зависимые ресурсы будут доступны.

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

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