Полный цикл в digital

Утилита systemctl в Linux

Systemd специальный инструмент для управления службами. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:

systemctl опции команда служба

Опции настраивают поведение программы (например подробность вывода), команда указывает что нужно сделать со службой.

Команды:

  • list-units посмотреть все службы (юниты) которые сейчас загружены в память, аналог опции -t
  • list-sockets посмотреть все сокеты служб, которые сейчас загружены в память
  • list-timers посмотреть список таймеров, загруженных в память
  • start запустить службу linux
  • stop остановить службу linux
  • reload попросить службу перечитать свою конфигурацию из файловой системы
  • restart перезапустить службу
  • try-restart перезапустить службу, только если она запущена
  • reload-or-restart попросить службу обновить свою конфигурацию, если не поддерживается просто выполнить перезапуск службы linux
  • isolate запустить только одну службу вместе с ее зависимостями, все остальные остановить
  • kill отправить сигнал завершения процессу используется вместе с опциями --signal и --kill-who
  • clean удалить все данные, которые касаются указанной службы, сюда входит кэш, логи, данные выполнения
  • is-active проверить запущена ли служба linux
  • is-failed проверить не завершилась ли служба с ошибкой
  • status посмотреть состояние и вывод службы
  • show посмотреть параметры управления службой в Linux
  • cat посмотреть содержимое юнит файла в текстовом виде
  • reset-failed очистить состояние failed для служб, которые завершились с ошибкой
  • list-dependencies посмотреть зависимости службы linux
  • list-unit-files вывести все установленные файлы служб
  • enable добавить службу в автозагрузку
  • disable удалить службу из автозагрузки
  • is-enabled проверить если ли уже служба в автозагрузке
  • reenable сначала выполнить disable потом enable для службы
  • list-jobs все выполняющиеся задачи Systemd.
  • snapshot сохранить состояние служб, чтобы потом восстановить
  • daemon-reload обновить конфигурацию юнитов для всех служб
  • mask - сделать юнит недоступным
  • unmask вернуть файл службы linux
  • link добавить юнит файл, который расположен не в стандартной папке для юнитов
  • revert вернуть юнит до состояния по умолчанию
  • edit отредактировать параметры службы не изменяя основной файл юнита.

Опции:

  • -t, --type отфильтровать список служб по типу
  • --state отфильтровать список служб по состоянию
  • -a, --all показать все известные службы, даже не запущенные
  • -q минимальный вывод
  • --version версия программы
  • --no-pager не использовать постраничную навигацию
  • --no-legend не выводить подробное описание

Список запущенных служб

Сначала давайте посмотрим все загруженные в память службы Linux. Для того чтобы отобразить только службы можно использовать фильтр по типу с помощью опции type:

systemctl list-units --type service

Обратите внимание, что команда не просто выводит текст, она передает этот текст утилите less. Здесь доступна прокрутка вверх и вниз, а также вправо и влево с помощью клавиш стрелок.

Команда отобразила все службы, которые известны systemd, они сейчас запущены или были запущены. Systemd не пересматривает все файлы юнитов при выполнении этой команды. В выводе утилиты есть несколько колонок:

  • LOAD значение loaded означает, что юнит службы был успешно загружен
  • ACTIVE состояние сервиса, позволяет понять запущен он или нет
  • SUB более подробное состояние службы
  • DESCRIPTION описание службы

Вы можете отфильтровать список служб systemctl по состоянию с помощью опции state. Например, только выполняющиеся:

systemctl list-units --type service --state running

Или те, которые завершились с ошибкой:

systemctl list-units --type service --state failed

Список всех служб

В предыдущем пункте было показано как посмотреть список служб, которые уже загружены в память systemd. Но для того чтобы посмотреть все службы необходимо обратиться к файлам юнитов, потому что далеко не все службы загружаются в память.

Для этого понадобится команда list-unit-files. Например, для вывода вообще всех юнитов воспользуйтесь такой командой:

systemctl list-unit-files

В выводе есть несколько колонок с информацией, в первой колонке выводится добавлен ли юнит в автозагрузку, а во второй должен ли он быть добавлен в автозагрузку по умолчанию. Теперь отфильтруем только службы Linux:

systemctl list-unit-files --type service

Поиск службы по имени

Если вы хотите найти определенную службу, но не знаете её полное имя, то можете использовать фильтр по паттерну. Например, так можно вывести все службы, которые начинаются со слова mysql:

systemctl list-unit-files 'mysql*'

Запуск службы

Для того чтобы запустить службу используется команда start. Ей необходимо передать имя службы в качестве параметра, для запуска Nginx выполните:

systemctl start nginx.service

Расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.

Остановка службы

Остановить службу можно командой:

systemctl stop nginx.service

Расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.

Перезапуск службы

Есть два способа перезагрузки служб. Это полная перезагрузка с помощью команды restart, которая включает завершение программы и её запуск, а также так называемая мягкая перезагрузка, когда systemd просит программу перечитать конфигурацию с диска. Такая перезагрузка выполняется с помощью команды reload, однако далеко не все сервисы её поддерживают.

Для полной перезагрузки Nginx выполните такую команду:

systemctl restart nginx

Для того чтобы попросить программу перечитать свою конфигурацию используйте команду reload:

systemctl reload nginx

Если служба не поддерживает этого, вы получите ошибку. Для того чтобы избежать этого и перезапустить службу полностью если мягкая перезагрузка не поддерживается используйте команду reload-or-restart:

systemctl reload-or-restart nginx

Состояние службы

Посмотреть состояние службы позволяет команда status:

systemctl status nginx

При выводе команды вы можете видеть текущее состояние процесса в поле Active. Возможные значения: active, inactive, failed, etc. Ещё тут выводится статистика по использованию памяти, количеству запущенных процессов и PID основного процесса. А также 10 последних строчек вывода программы, которые очень помогут решить проблему с запуском если она возникнет. Если этих данных вам не достаточно, то вы можете указать количество строк для вывода используя опцию --lines:

systemctl status --lines=50 avahi-daemon

Автозагрузка службы

Для добавления службы в автозагрузку, используйте команду enable. Например, команда добавления Nginx в автозагрузку будет выглядеть:

systemctl enable nginx

Для удаления из автозагрузки используйте команду disable:

systemctl disable nginx

Редактирование файла службы

Иногда возникает необходимость отредактировать файл службы. Например, для того чтобы добавить дополнительные переменные окружения или настроить автоматический перезапуск. Но редактировать сам файл сервиса в папке /usr/lib или /lib не желательно, поскольку при следующем обновлении пакета он будет перезаписан.

Вы можете скопировать файл юнита в папку /etc/systemd/system/ и редактировать его там. Специально для таких случаев была разработана команда edit. Если её использовать с опцией --full она создаст файл в папке /etc/systemd/* в котором вы можете изменять всё что вам нужно. Например, вы можете выполнить следующую команду для того чтобы отредактировать конфигурационный файл Nginx:

systemctl edit --full nginx

Если же вы выполните команду edit без опции --full, то будет создана папка /etc/systemd/system/nginx.service.d, в которой появится файл override.conf. Здесь нужно разместить только параметры, которые вы хотите добавить или значения которых нужно переопределить.

После внесения изменений необходимо обновить конфигурацию Systemd с диска:

systemctl daemon-reload

Затем вы можете перезапустить сервис и убедится, что настройки применились.

Удаление службы

Удалить службу можно удалив пакет, вместе с которым она поставляется. Однако если это стандартная служба, то это сделать не получится. Существует способ отключать юниты, если вы не хотите чтобы кто-то их использовал. Это маскировка, для этого используйте команду mask, для Nginx:

systemctl mask nginx

Эта команда создает в папке /etc/systemd/system символическую ссылку на /dev/null с именем файла службы, после чего служба считается отключённой. Обратите внимание, что если вы редактировали файл юнита и в папке /etc/systemd/system уже существует его файл, то вы можете получить ошибку Failed to mask unit: File /etc/systemd/system/*.service already exists. В таком случае все ваши изменения нужно удалить командой revert. При выполнении этой команды ваши изменения будут удалены:

systemctl revert nginx

Информацию о том, что служба замаскирована можно увидеть в выводе команды status:

systemctl status nginx

Для того чтобы вернуть всё как было выполните команду unmask:

systemctl unmask nginx

Управление службами пользователей

Кроме системных служб Systemd поддерживает службы, работающие от имени обычного пользователя. Они не требуют прав суперпользователя, запускаются при авторизации пользователя в системе и завершаются после завершения его последней сессии. Юнит файлы для этих служб выглядят так же как и для обычных только расположены они в домашней папке пользователя $USER/.config/systemd/user или в системной папке /usr/lib/systemd/user/.

Все команды для управления такими службами аналогичны обычным, только нужно добавить опцию --user. Например, для того чтобы получить список всех служб которые могут работать от имени пользователя выполните:

systemctl --user list-unit-files --type service

Для просмотра состояния службы используется команда status. Например для службы dbus команда будет выглядеть так:

systemctl --user status dbus.service
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг