Утилита systemctl в Linux
Systemd специальный инструмент для управления службами. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:
systemctl опции команда служба
Опции настраивают поведение программы (например подробность вывода), команда указывает что нужно сделать со службой.
Команды:
list-unitsпосмотреть все службы (юниты) которые сейчас загружены в память, аналог опции -tlist-socketsпосмотреть все сокеты служб, которые сейчас загружены в памятьlist-timersпосмотреть список таймеров, загруженных в памятьstartзапустить службу linuxstopостановить службу linuxreloadпопросить службу перечитать свою конфигурацию из файловой системыrestartперезапустить службуtry-restartперезапустить службу, только если она запущенаreload-or-restartпопросить службу обновить свою конфигурацию, если не поддерживается просто выполнить перезапуск службы linuxisolateзапустить только одну службу вместе с ее зависимостями, все остальные остановитьkillотправить сигнал завершения процессу используется вместе с опциями --signal и --kill-whocleanудалить все данные, которые касаются указанной службы, сюда входит кэш, логи, данные выполненияis-activeпроверить запущена ли служба linuxis-failedпроверить не завершилась ли служба с ошибкойstatusпосмотреть состояние и вывод службыshowпосмотреть параметры управления службой в Linuxcatпосмотреть содержимое юнит файла в текстовом видеreset-failedочистить состояние failed для служб, которые завершились с ошибкойlist-dependenciesпосмотреть зависимости службы linuxlist-unit-filesвывести все установленные файлы службenableдобавить службу в автозагрузкуdisableудалить службу из автозагрузкиis-enabledпроверить если ли уже служба в автозагрузкеreenableсначала выполнить disable потом enable для службыlist-jobsвсе выполняющиеся задачи Systemd.snapshotсохранить состояние служб, чтобы потом восстановитьdaemon-reloadобновить конфигурацию юнитов для всех службmask -сделать юнит недоступнымunmaskвернуть файл службы linuxlinkдобавить юнит файл, который расположен не в стандартной папке для юнитов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