Утилита 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