Прочитав man 5 systemd.unit
и man 5 systemd.target
сообщив нам, что файлы юнитов используются для определения целей, а также всего остального systemd. Нет конкретной документации о том, как создать цель , поэтому трудно определить, как это должно быть сделано, но это не слишком отличается от создания службы.
Когда вы создаете свою цель, вам нужно будет создать символические ссылки на target.wants
каталог из каталога системных служб. Затем вы можете установить / загрузить вашу цель. Вот как это может выглядеть на вашем примере.
/etc/systemd/system/foo.target
Это файл объекта цели. Если в качестве примера взят graphical.target, мы можем создать нашу собственную цель, используя ее в качестве базы.
[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes
Объяснить варианты, взятые из man-страниц systemd;
Description
- Описывает цель. Ты должен понимать
Requires
- Жесткие зависимости от цели. Вам следует разрешить запуск базовой системы, прежде чем запускать собственные службы
Wants
- Мягкие зависимости. Цель не требует, чтобы они начали.
Conflicts
- Если у какого-либо устройства есть настройка Конфликты на другом устройстве, запуск первого остановит последний, и наоборот.
After
- сапоги после этих услуг
AllowIsolate
- Действительно зависит от вас и вашего окружения. Подробности доступны на странице руководстваsystemd.unit(5)
/etc/systemd/system/foo.target.wants/
Это каталог, где вы будете связывать услуги, которые вы создаете / запрашиваете для своей цели. Это эквивалентно Wants=
опции в файле модуля. Создайте этот каталог, а затем создайте символические ссылки следующим образом; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service
, Это создает символическую ссылку из bar.service в системном каталоге на ваш каталог foo.target.wants.
Я думаю, что создание файла модуля для службы выходит за рамки этого ответа, и этот вопрос определенно более задокументирован, поэтому я пока оставлю это в стороне. Когда вы создаете файл модуля, просто вставьте его в каталог target.wants или добавьте его в Wants=
директиву.
foo.target
вRequires
поле иBefore
полеmulti-user.target
, и это нравитсяRequires: base.target foo.target
. После этого я перезагружаю свой Arch Linux vm иfoobar.service
автоматически запускаюсь как демон.