Вопрос или проблема
Я создаю “таргет” в /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
, которая размещена на диске, монтируемом позднее в процессе загрузки.
Вот несколько шагов и рекомендаций, которые помогут вам правильно настроить целевую единицу и ее зависимости:
-
Проверьте структуру ваших файлов:
Убедитесь, что файлsp-example.target
и символическая ссылка на ваш сервис находятся в правильных директориях. Это должно выглядеть так:/etc/systemd/system/sp-example.target /etc/systemd/system/sp-example.target.wants/<ваш_сервис>.service
-
Монтирование дисков:
Поскольку ваш сервис находится на диске, который монтируется позже, это может стать причиной того, что systemd не находит вашу зависимость на момент инициализацииsp-example.target
. Убедитесь, что все необходимые вам диски монтируются до того, как будет выполнена цель, для которой вы создали "wants" директорию. -
Обновление конфигурации systemd:
После того как диск смонтирован, вам нужно уведомить systemd о внесенных изменениях. Для этого выполните следующие команды:systemctl daemon-reload systemctl start <ваш_сервис>
Это позволит systemd обновить конфигурацию и учитывать новые связи между целевыми единицами и сервисами.
-
Размещение в дополнительном скрипте:
Если вы хотите, чтобы указанные команды выполнялись автоматически после монтирования диска, можно создать простой скрипт в одном из/etc/rc5.d/
подкаталогов. Однако, если у вас есть сервис, который может управлять монтированием и загрузкой, лучше прописать зависимости корректно в самом unit-файле, используя директивыAfter=
иRequires=
. -
Проверка зависимостей:
В вашем файле сервиса, возможно, вам следует добавлять зависимости, чтобы убедиться, что сервис запускается только после монтирования нужного диска. Например, если ваш диск монтируется черезmount
, добавьте в ваш сервис файл:[Unit] After=local-fs.target Requires=your-mount-point.mount
- Логи и отладка:
Для получения дополнительной информации о том, что происходит при запуске и загрузке, вы можете проверить логи systemd с помощью команды:journalctl -xe
Это позволит вам понять, почему сервис не был запущен.
С соблюдением этих рекомендаций, вы сможете убедиться, что ваши "wants" директории правильно работают даже с монтированием дисков, и ваши сервисы будут запускаться автоматически, как только все зависимые ресурсы будут доступны.