Управление службами Systemd. Часть 3 из 3
Использование целей
Одна из функций системы инициализации — перевод сервера в различные состояния. Обычно они называются уровнями запуска или уровнями выполнения. В заданный момент времени система может находиться только на одном уровне выполнения.
- Цель
poweroff.target
, уровень запуска 0 - Цель
rescue.target
, уровень запуска 1 - Цель
multi-user.target
, уровень запуска 2 - Цель
multi-user.target
, уровень запуска 3 - Цель
multi-user.target
, уровень запуска 4 - Цель
graphical.target
, уровень запуска 5 - Цель
reboot.target
, уровень запуска 6
В Systemd вместо этого применяются цели. Цель — это точка синхронизации, которой можно воспользоваться для перехода в определенное состояние. К цели можно привязать службы и другие юниты, одновременно может быть активно несколько целей. Для просмотра полного списка целей в системе нужно выполнить команду:
$ systemctl list-units --type=target UNIT LOAD ACTIVE SUB DESCRIPTION ---------------------------------------------------------------------------- basic.target loaded active active Basic System cryptsetup.target loaded active active Local Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network.target loaded active active Network nss-lookup.target loaded active active Host and Network Name Lookups nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization time-sync.target loaded active active System Time Synchronized timers.target loaded active active Timers LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 20 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
Для просмотра цели по умолчанию, которой Systemd стремится достичь при загрузке (которая, в свою очередь, запускает все файлы юнитов, составляющие дерево зависимости этой цели), выполняем команду:
$ systemctl get-default graphical.target
Текущая цель системы при загрузке — graphical.target
. При помощи команды set-default
можно изменить цель по умолчанию:
$ sudo systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
Теперь при загрузке система попытается достичь новой цели — multi-user.target
, вместо прежней — graphical.target
.
Если мы работаем в графической среде с активным graphical.target
, можно отключить графическую систему и перевести систему в состояние многопользовательской командной строки, изолировав multi-user.target
. Поскольку graphical.target
зависит от multi-user.target
, но не наоборот, все графические блоки будут остановлены.
$ sudo systemctl isolate multi-user.target
Чтобы вернуться к graphical.target
, нужно выполнить команду
$ sudo systemctl isolate graphical.target
Данная команда только изменит текущую цель и не повлияет на следующую загрузку системы.
Остановка и перезапуск сервера
Система инициализации поддерживает сокращённые команды. Например, чтобы отключить сервер:
$ sudo systemctl poweroff
Чтобы перезапустить сервер:
$ sudo systemctl reboot
Запустить сервер в режиме восстановления:
$ sudo systemctl rescue
Просмотр логов
Компонент Systemd под названием journald
собирает и управляет общесистемными записями в журнале — то есть данными логов приложений и ядра. Чтобы просмотреть все записи, начиная с самой старой записи:
$ journalctl
По умолчанию эта команда выведет записи текущей и предыдущих загрузок (если инструмент journald
настроен для сохранения записей от предыдущих загрузок). Некоторые дистрибутивы включают это поведение по умолчанию, а некоторые — нет. Чтобы включить сохранение записей от предыдущих загрузок:
- Установить значение
persistent
для параметраStorage
в файле конфигурации/etc/systemd/journald.conf
- Создать постоянный каталог
/var/log/journal
Чтобы просмотреть только записи текущей загрузки:
$ journalctl -b
Посмотреть список последних загрузок системы:
$ journalctl --list-boots
Записи журнала определенной загрузки (boot-id — см. предыдущую команду):
$ journalctl -b <boot-id>
Записи ядра можно просмотреть при помощи команды:
$ journalctl -k
Если совместить флаги -k
и -b
, можно получить записи ядра только для текущей загрузки.
$ journalctl -k -b
Чтобы просмотреть все записи в журнале, сделанные определённым юнитом:
$ journalctl -u nginx.service
Ограничить вывод текущей загрузкой можно с помощью флага -b
:
$ journalctl -b -u nginx.service
Запуск скриптов при загрузке
Раньше для этих целей использовался файл /etc/rc.local
, теперь так делать не рекомендуется. Тем не менее, если такой файл существует и является исполняемым, он будет выполнен специальным юнитом rc-local
:
$ systemctl status rc-local.service ● rc-local.service - /etc/rc.local Compatibility Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) Drop-In: /lib/systemd/system/rc-local.service.d └─debian.conf Active: inactive (dead) Docs: man:systemd-rc-local-generator(8)
$ systemctl cat rc-local.service
# /lib/systemd/system/rc-local.service # SPDX-License-Identifier: LGPL-2.1+ # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # This unit gets pulled automatically into multi-user.target by # systemd-rc-local-generator if /etc/rc.local is executable. [Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no
# /lib/systemd/system/rc-local.service.d/debian.conf [Unit] # not specified by LSB, but has been behaving that way in Debian under SysV # init and upstart After=network-online.target # Often contains status messages which users expect to see on the console # during boot [Service] StandardOutput=journal+console StandardError=journal+console