Шпаргалка по командам systemctl и systemd в Linux
systemd — это подсистема инициализации и управления службами в Linux. Если говорить проще, она отвечает за запуск системы, управление сервисами, автозагрузку, зависимости между службами и часть фоновых процессов.
Сразу договоримся: инициализация — это действия, которые выполняются при загрузке операционной системы. Раньше для этого часто использовались shell-скрипты SysV init, но в современных Linux-дистрибутивах их во многом заменил systemd.
systemd спроектирован с обратной совместимостью со скриптами SysV init, но при этом дает больше возможностей: параллельный запуск сервисов при загрузке, запуск демонов по требованию, управление зависимостями, реакцию на изменение состояния служб и удобное журналирование.
Небольшое отступление. Именно из-за большого количества функций systemd часто критикуют сторонники классического unix-way. По этому принципу одна программа должна выполнять одну задачу, но делать это хорошо. systemd же взял на себя сразу много разных обязанностей, из-за чего споры вокруг него не утихают до сих пор.
В этой статье собрал шпаргалку по управлению сервисами через systemctl, а также базовые понятия systemd, которые полезно понимать при администрировании Linux-сервера.
Что такое unit в systemd
systemd работает не напрямую с «сервисами», а с так называемыми unit-файлами. Unit — это конфигурационный модуль, который описывает службу, таймер, точку монтирования, socket, target или другой системный объект.
Файлы unit-модулей могут находиться в нескольких директориях. Важно понимать их приоритет:
/etc/systemd/system/— пользовательские unit-файлы, созданные или измененные администратором. Имеют самый высокий приоритет;/run/systemd/system/— временные unit-файлы, созданные динамически во время работы системы;/usr/lib/systemd/system/— unit-файлы, установленные вместе с пакетами RPM.
Если нужно создать свой сервис или переопределить поведение существующего, обычно работают именно с каталогом /etc/systemd/system/.
Основные типы unit-файлов
systemd поддерживает разные типы unit-файлов. Чаще всего приходится работать с .service и .timer, но полезно знать и остальные.
- .service — обычная служба, демон или любой процесс, который можно запустить;
- .target — группа unit-файлов, аналог уровней запуска;
- .mount — точка монтирования файловой системы;
- .automount — отложенное монтирование файловой системы при обращении к точке монтирования;
- .swap — файл или устройство подкачки;
- .timer — запуск unit-файлов по расписанию, аналог cron;
- .socket — socket-активация служб, похожая по идее на xinetd;
- .slice — группировка процессов в дереве cgroups для управления ресурсами;
- .device — реакция на подключение устройств;
- .path — запуск unit-файла при событии в файловой системе.
Примечание. cgroups — это механизм Linux для объединения процессов в группы и назначения им ограничений. Например, можно ограничить потребление CPU, памяти или других ресурсов.
Основные возможности systemd
systemd занимается не только запуском сервисов. В него входит довольно много инструментов, которые раньше часто решались отдельными программами.
- управление системными сервисами;
- автозагрузка служб;
- socket-активация сервисов;
- запуск задач по расписанию через timer-юниты;
- журналирование через
journalctl; - анализ скорости загрузки через
systemd-analyze; - автомонтирование томов и сетевых ресурсов;
- работа с зависимостями между службами;
- управление группами процессов через cgroups.
Управление сервисами через systemctl
Для управления службами используется команда systemctl. В старых версиях CentOS часто использовались команды service и chkconfig. В CentOS 7 они еще доступны для совместимости, но основной инструмент — именно systemctl.
При использовании systemctl расширение .service можно не указывать. Например, команды systemctl restart nginx и systemctl restart nginx.service будут работать одинаково.
Запуск сервиса
systemctl start name.service
Остановка сервиса
systemctl stop name.service
Перезапуск сервиса
systemctl restart name.service
Перезапуск только если сервис уже запущен
systemctl try-restart name.service
Перечитать конфигурацию сервиса без полного перезапуска
systemctl reload name.service
Команда reload сработает только в том случае, если сам сервис поддерживает перечитывание конфигурации без перезапуска.
Проверить состояние сервиса
systemctl status name.service
Проверить, запущен ли сервис
systemctl is-active name.service
В ответ будет выведено простое состояние, например active или inactive.
Показать все сервисы
systemctl list-units --type service --all
Автозагрузка сервисов
Отдельно стоит различать запуск сервиса сейчас и добавление его в автозагрузку. Команда start запускает службу только в текущий момент, а enable включает ее автоматический запуск при старте системы.
Добавить сервис в автозагрузку
systemctl enable name.service
Отключить автозагрузку сервиса
systemctl disable name.service
Переустановить автозагрузку сервиса
systemctl reenable name.service
Команда сначала отключает сервис из автозагрузки, а затем включает его снова. Это бывает полезно после изменения секции [Install] в unit-файле.
Проверить, включена ли автозагрузка
systemctl is-enabled name.service
Показать все unit-файлы сервисов
systemctl list-unit-files --type service
Mask и unmask: полное отключение сервиса
Команда disable отключает автозагрузку, но не запрещает запуск сервиса вручную или как зависимости другого unit-файла.
Если нужно полностью запретить запуск сервиса, используется mask.
systemctl mask name.service
Эта команда создает символическую ссылку на /dev/null в каталоге /etc/systemd/system. Так как этот каталог имеет самый высокий приоритет, systemd считает unit недоступным.
Чтобы вернуть сервис обратно:
systemctl unmask name.service
Важно. Даже если сервис отключен из автозагрузки черезdisable, он все равно может быть запущен как зависимость другого сервиса. Если нужно запретить запуск полностью — используйтеmask.
Управление systemd на удаленной машине
systemd позволяет управлять сервисами на удаленной машине по SSH.
systemctl --host user_name@host_name command
Где user_name — имя пользователя, host_name — адрес удаленного сервера, а command — команда systemd, которую нужно выполнить.
Например:
systemctl --host root@example.com status nginx
Просмотр логов через journalctl
После проверки статуса сервиса часто нужно посмотреть его логи. Для этого используется journalctl.
Логи конкретного сервиса
journalctl -u name.service
Следить за логами в реальном времени
journalctl -u name.service -f
Показать последние записи
journalctl -u name.service -n 100
Показать ошибки текущей загрузки
journalctl -xe
Команда journalctl -xe особенно полезна, когда сервис не запускается, но по systemctl status не хватает информации.
Проверка таймеров systemd
Таймеры systemd можно использовать вместо cron. Например, чтобы запускать задачу каждую минуту, каждый час или по конкретному расписанию.
Посмотреть активные таймеры можно командой:
systemctl list-timers
Если нужно показать все таймеры, включая неактивные:
systemctl list-timers --all
Типичный systemd .service
Рассмотрим пример простого service-файла.
[Unit]
Description=Daemon to detect crashing apps
After=syslog.target
[Service]
ExecStart=/usr/sbin/abrtd
Type=forking
[Install]
WantedBy=multi-user.target
Секция [Unit] содержит общую информацию о сервисе. Такая секция есть не только у .service, но и у других типов unit-файлов.
Description— человекочитаемое описание сервиса;After— указывает, после каких unit-файлов должен запускаться текущий сервис.
Секция [Service] описывает, что именно делает сервис.
ExecStart— команда запуска сервиса;Type— способ, которым сервис сообщает systemd о завершении запуска.
Секция [Install] используется командами systemctl enable и systemctl disable.
WantedBy— target, в который будет добавлена ссылка на сервис при включении автозагрузки.
Чтобы создать собственный сервис, поместите файл в каталог:
/etc/systemd/system/name.service
После создания или изменения unit-файла необходимо выполнить:
systemctl daemon-reload
Эта команда заставит systemd перечитать unit-файлы и увидеть новые изменения.
Проверка unit-файла
Перед запуском нового сервиса полезно проверить unit-файл на ошибки:
systemd-analyze verify /etc/systemd/system/name.service
Если ошибок нет, можно запускать сервис:
systemctl start name.service
Просмотр содержимого unit-файла
Unit-файл можно открыть в текстовом редакторе или посмотреть через cat, но удобнее использовать команду systemd:
systemctl cat sshd.service
Так можно быстро посмотреть основной unit-файл и все override-настройки, если они есть.
Зависимости порядка: After и Before
В systemd важно различать зависимости порядка и зависимости требования.
After= и Before= отвечают только за порядок запуска.
After=network.target— запускать текущий unit послеnetwork.target;Before=nginx.service— запускать текущий unit доnginx.service.
Важно. After= не запускает указанный unit автоматически. Он только говорит systemd: если оба unit-файла запускаются, то текущий должен стартовать после указанного.
Зависимости требования: Wants и Requires
Wants= и Requires= описывают уже не порядок, а само требование наличия другого unit-файла.
Wants= означает мягкую зависимость. systemd попробует запустить указанный unit, но если он завершится ошибкой, текущий unit все равно может продолжить запуск.
Requires= — жесткая зависимость. Если зависимый unit не запустится, запуск текущего unit будет остановлен.
Например, если у sshd.service указан Wants=sshd-keygen.service, systemd попробует запустить генерацию ключей, но не будет блокировать запуск SSH-сервера только из-за ошибки зависимого unit-файла.
Главное правило. Зависимости порядка и зависимости требования не связаны между собой.After=не означаетRequires=, аRequires=не задает порядок запуска. Если нужны оба поведения, их нужно указывать отдельно.
Полезные параметры секции Service
В секции [Service] описывается поведение сервиса.
ExecStart=— команда запуска;ExecReload=— команда перечитывания конфигурации;Restart=— правило перезапуска сервиса при падении или завершении;KillMode=— способ завершения процесса и его потомков;User=— пользователь, от имени которого запускается сервис;Group=— группа запуска;WorkingDirectory=— рабочая директория;Environment=— переменные окружения.
Например, параметр KillMode=process означает, что сигнал завершения будет отправлен только главному процессу, а что делать с дочерними процессами — уже его ответственность.
Параметр Restart= определяет, когда systemd должен перезапускать сервис. Например, часто используют:
Restart=on-failure
Что делает секция Install
Секция [Install] используется при выполнении команд systemctl enable и systemctl disable.
Например:
systemctl enable sshd.service
При выполнении этой команды systemd создаст символическую ссылку на sshd.service внутри нужного target, например multi-user.target. После этого SSH-сервис будет запускаться при достижении этого target во время загрузки системы.
Override-настройки через systemctl edit
Не всегда нужно редактировать основной unit-файл. Более правильный способ изменить поведение установленного сервиса — создать override-конфигурацию.
systemctl edit name.service
systemd создаст отдельный файл переопределений, а основной unit-файл из пакета останется нетронутым. Это удобно, потому что при обновлении пакета ваши изменения не потеряются.
После изменения override-файла также нужно выполнить:
systemctl daemon-reload
Анализ загрузки системы
systemd умеет показывать, какие сервисы дольше всего запускались при старте системы.
Общее время загрузки
systemd-analyze
Самые медленные сервисы
systemd-analyze blame
Критическая цепочка загрузки
systemd-analyze critical-chain
Эти команды полезны, если сервер долго загружается и нужно понять, какой сервис тормозит старт системы.
Краткая шпаргалка команд systemctl
systemctl start name— запустить сервис;systemctl stop name— остановить сервис;systemctl restart name— перезапустить сервис;systemctl reload name— перечитать конфигурацию сервиса;systemctl status name— посмотреть состояние сервиса;systemctl is-active name— проверить, запущен ли сервис;systemctl enable name— добавить сервис в автозагрузку;systemctl disable name— убрать сервис из автозагрузки;systemctl is-enabled name— проверить автозагрузку;systemctl mask name— полностью запретить запуск сервиса;systemctl unmask name— снять запрет запуска;systemctl daemon-reload— перечитать unit-файлы;systemctl cat name— посмотреть unit-файл;systemctl edit name— создать override-настройки;systemctl list-timers— посмотреть таймеры;systemctl list-units --type service --all— показать все сервисы.
Даже если вы редко занимаетесь администрированием Linux, базовые команды systemctl сильно упрощают работу с сервером. Запустить сервис, проверить его состояние, добавить в автозагрузку, посмотреть логи или найти проблему при запуске — все это решается буквально несколькими командами.
systemd часто кажется громоздким, особенно если привыкнуть к старым init-скриптам. Но на практике он дает удобную единую точку управления сервисами, зависимостями, таймерами и журналами. Поэтому знать основы systemd полезно любому разработчику, который хотя бы иногда работает с Linux-серверами.
Комментарии
Будем рады вашему мнению и вопросам по статье.