Говоря о юнитах systemd, нельзя не отметить такой тип юнита как
таргет (цель, taget). Таргет – это особый тип юнита, который позволяет объединить несколько юнитов в группу и управлять ими как единым целым. Вы можете создать собственный таргет из взаимозависимых служб и, скажем, одновременно перезапускать все относящиеся к веб-серверу службы: веб-север, СУБД, PHP и т.д.
Но об этом мы поговорим как-нибудь позже, а сегодня наше внимание займут стандартные таргеты.
Посмотреть список стандартных целей можно командой:
systemctl -–type=target
После чего мы увидим список всех активных таргетов, чтобы увидеть полный список используйте команду:systemctl -–type=target -–all
Что в этом полезного и для чего мы можем их использовать? Прежде всего для указания зависимостей. Допустим нам нужно, чтобы наша служба запускалась после того, как будет инициирована сеть, нет ничего проще:After=network.target
Если вы используете сетевые файловые системы, такие как NFS или CIFS/SMB и ваша служба должна запуститься после того, как они будут смонтированы:After=remote-fs.target
И не нужно ничего придумывать, systemd уже подумала за вас.У некоторых целей может быть сразу несколько вариантов, например, существуют сразу три сетевых таргета:
▫️
network-pre.target
▫️ network.target
▫️ network-online.target
Цель network-pre.target представляет собой точку состояния системы перед запуском сетевых служб и может быть использована для запуска тех служб, которые обязательно должны быть активны на момент запуска сети, например, брандмауэр.Данная цель должна использоваться как
Before=network-pre.target или Wants=network-pre.target.Собственно
network.target обозначает состояние запуска всех сетевых служб системы и для прочих юнитов, которым нужна сеть мы должны использовать After=network.target, т.е. состояние после того, как все сетевые службы были запущены.И, наконец,
network-online.target – это точка состояния системы, когда все сетевые службы успешно и гарантированно запущены. Используется только с Wants= и After=, используется в основном для устаревших служб или сценариев, которые некорректно работают с After=network.target.Отдельного разговора заслуживают
Boot targets – цели загрузки, эти таргеты являются аналогами уровней запуска init. Существуют следующие загрузочные таргеты:▫️
poweroff.target (runlevel 0) – выключение системы▫️
rescue.target (runlevel 1) – режим восстановления системы▫️
multi-user.target (runlevel3) – многопользовательский режим (консольный режим без графики)▫️
graphical.target (runlevel 5) – режим графического окружения▫️
reboot.target (runlevel 6) – перезагрузка системыТакже существует загрузочный таргет по умолчанию -
default.target, который является символьной ссылкой на один из загрузочных таргетов и определяет в какой именно режим будет загружена система по умолчанию. Узнать текущее состояние по умолчанию можно командой:
systemctl get-default
А установить новую цель загрузки можно командой:systemctl set-default graphical.targetПри этом
graphical.target имеет одну особенность, при отсутствии графики он запускается и работает аналогично multi-user.target и поэтому не следует удивляться, увидев его в системе без графической оболочки или в контейнере.По-умолчанию
graphical.target для систем без графического окружения используют Debian и Ubuntu.Также мы можем переключаться между уровнями загрузки без перезагрузки системы при помощи команды
isolate. Так если мы выполним в графической среде: systemctl isolate multi-user.target
То все графические модули будут остановлены, и система перейдет в режим командной строки.Ну и напоследок весьма злая шутка:
systemctl set-default reboot.target 👻👻👻После чего можно принимать ставки как быстро коллега разберется в чем дело. Но такие шутки довольно вредны для здоровья. Минздрав предупреждает!