В операционной системе Linux, так же как и в Windows, кроме обычных программ, с которыми может взаимодействовать пользователь есть еще один вид программ. Это работающие в фоне службы. Важность служб тяжело переоценить, они следят за состоянием системы, обеспечивают автоматическое подключение внешних устройств и сети, позволяют процессам взаимодействовать с оборудованием (dbus), а также в виде служб реализованы различные веб-серверы и серверы баз данных.
Поскольку службы выполняются в фоновом режиме, вы не можете взаимодействовать с ними привычными способами. В этой статье мы рассмотрим управление службами Linux. Вы узнаете, как посмотреть запущенные службы Linux, а также останавливать и запускать их самому.
Содержание статьи
Немного теории
Чтобы всем этим управлять нужна основная служба - система инициализации, которая будет запускать службы Linux в нужный момент, следить чтобы они нормально работали, записывать сообщения логов, и самое главное предоставлять пользователям интерфейс для управления службами. Саму систему инициализации запускает ядро Linux.
Раньше, для управления службами использовались скрипты. Тогда каждая служба запускалась в фоновом режиме одна за другой, без возможности параллельного запуска. Скрипт инициализации получал PID процесса для каждой службы, сохранял его и потом с помощью него можно было проверить работает ли служба и остановить службу Linux если это нужно. Все это можно сделать и вручную.
Но потом на смену этому методу пришла новая модель и система инициализации Systemd. Эта система позволяет запускать службы параллельно, поэтому появилась необходимость настраивать зависимости между службами. Таким образом, теперь порядок запуска служб определяет сложное дерево зависимостей. После запуска Systemd собирает весь вывод службы в лог, и следит за ее работой, если служба аварийно завершилась, то автоматически ее перезапускает при необходимости.
Служба в Systemd описывается файлом юнита, в нем описано каким образом эту службу надо запускать, а также как с ней себя вести. Существуют такие типы юнитов:
- service - обычная служба, программа
- target - группа служб
- automount - точка автоматического монтирования
- device - файл устройства, генерируется на этапе загрузки
- mount - точка монтирования
- path - файл или папка
- scope - внешний процесс
- slice - группа системных служб systemd
- snapshot - сохраненное состояние запущенных служб
- socket - позволяет активировать службу по необходимости.
В этой статье мы рассмотрим только обычные службы, то есть *.service, и совсем немного *.target, но мы перечислили здесь все остальные типы юнитов, чтобы вы смогли взглянуть на картину немного шире.
Ещё все службы Systemd можно поделить на две группы:
- system - системные службы, запускаемые от имени суперпользователя, файлы таких служб находятся в папке /lib/systemd/system или /usr/lib/systemd/system;
- user - службы, с которыми можно взаимодействовать от имени обычного пользователя, их файлы располагаются в /lib/systemd/user или /usr/lib/systemd/user или в домашней папке пользователя $USER/.config/systemd/user.
Кроме того, у Systemd есть задачи (Jobs), они выполняются и видны только когда к какой нибудь службе применяется действие, например, запуск или остановка.
Основы рассмотрели, теперь будет настройка служб LInux. Давайте познакомимся с утилитой для управления службами.
Утилита systemctl
В Systemd есть специальный инструмент для управления службами в Linux - команда systemctl. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы linux и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:
$ 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 - отредактировать параметры службы не изменяя основной файл юнита.
Команда systemctl поддерживает и другие команды, но в этой статье перечислены только самые популярные.
А теперь основные опции:
- -t, --type - отфильтровать список служб по типу
- --state - отфильтровать список служб по состоянию
- -a, --all - показать все известные службы, даже не запущенные
- -q - минимальный вывод
- --version - версия программы
- --no-pager - не использовать постраничную навигацию
- --no-legend - не выводить подробное описание
Большинство действий выполняются именно командами, а опции только помогают сделать вывод более удобным.
Управление службами Linux
Теперь, когда вы уже знаете все основы, команды и параметры можно переходить к делу. Со всеми остальными тонкостями разберемся по пути.
1. Список запущенных служб
Сначала давайте посмотрим все загруженные в память службы Linux. Для того чтобы отобразить только службы можно использовать фильтр по типу с помощью опции type:
systemctl list-units --type service
Обратите внимание, что команда не просто выводит текст, она передает этот текст утилите less. Здесь доступна прокрутка вверх и вниз, а также вправо и влево с помощью клавиш стрелок. Для того чтобы выйти обратно в терминал нажмите клавишу q.
Команда отобразила все службы, которые известны systemd, они сейчас запущены или были запущены. Systemd не пересматривает все файлы юнитов при выполнении этой команды. В выводе утилиты есть несколько колонок:
- LOAD - значение loaded означает, что юнит службы был успешно загружен
- ACTIVE - состояние сервиса, позволяет понять запущен он или нет.
- SUB - более подробное состояние службы.
- DESCRIPTION - описание службы.
Дальше больше. Вы можете отфильтровать список служб systemctl по состоянию с помощью опции state. Например, только выполняющиеся:
systemctl list-units --type service --state running
Или те, которые завершились с ошибкой:
systemctl list-units --type service --state failed
Для фильтрации можно брать любое значение состояния из колонки ACTIVE или SUB.
2. Список всех служб
В предыдущем пункте было показано как посмотреть список служб, которые уже загружены в память systemd. Но для того чтобы посмотреть все службы необходимо обратиться к файлам юнитов, потому что далеко не все службы загружаются в память.
Для этого понадобится команда list-unit-files. Например, для вывода вообще всех юнитов воспользуйтесь такой командой:
systemctl list-unit-files
Здесь тоже есть несколько колонок с информацией, в первой колонке выводится добавлен ли юнит в автозагрузку, а во второй должен ли он быть добавлен в автозагрузку по умолчанию. Теперь отфильтруем только службы Linux:
systemctl list-unit-files --type service
Здесь вы тоже можете использовать фильтры по состоянию, но значения будут уже другие. Теперь вы знаете как посмотреть запущенные службы Linux.
3. Поиск службы по имени
Если вы хотите найти определенную службу, но не знаете её полное имя, то можете использовать фильтр по паттерну. Например, так можно вывести все службы, которые начинаются со слова mysql:
systemctl list-unit-files 'mysql*'
4. Запуск службы
Для того чтобы запустить службу используется команда start. Ей необходимо передать имя службы в качестве параметра:
sudo systemctl start имя_службы.service
Например, для запуска Nginx выполните:
sudo systemctl start nginx.service
Причем расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.
5. Остановка службы
Остановить службу linux можно командой:
sudo systemctl stop <имя_службы.service>
Например, для остановки Nginx можно использовать такую команду:
sudo systemctl stop nginx
Кроме того, вы можете остановить несколько сервисов одной командой используя фильтрацию по паттерну. Например, для остановки всех сервисов, имена которых начинаются с php выполните:
sudo systemctl stop 'php*.service'
Но это будет работать только для запущенных служб. Запускать службы таким образом нельзя. Сопоставление по паттерну работает только для загруженных в память юнитов, а поэтому невозможно быть уверенным что список для запуска будет полным.
6. Перезапуск службы
Есть два способа перезагрузки служб. Это полная перезагрузка с помощью команды restart, которая включает завершение программы и её запуск, а также так называемая мягкая перезагрузка, когда systemd просит программу перечитать конфигурацию с диска. Такая перезагрузка выполняется с помощью команды reload, однако далеко не все сервисы её поддерживают.
Для полной перезагрузки Nginx выполните такую команду:
sudo systemctl restart nginx
Для того чтобы попросить программу перечитать свою конфигурацию используйте команду reload:
sudo systemctl reload nginx
Если служба не поддерживает этого, вы получите ошибку. Для того чтобы избежать этого и перезапустить службу полностью если мягкая перезагрузка не поддерживается используйте команду reload-or-restart. Например:
sudo systemctl reload-or-restart nginx
7. Состояние службы
Посмотреть состояние службы позволяет команда status:
sudo systemctl status имя_службы
Например, для Nginx:
sudo systemctl status nginx
Здесь вы можете видеть текущее состояние процесса в поле Active. Возможные значения: active, inactive, failed, etc. Ещё тут выводится статистика по использованию памяти, количеству запущенных процессов и PID основного процесса. А также 10 последних строчек вывода программы, которые очень помогут решить проблему с запуском если она возникнет. Если этих данных вам не достаточно, то вы можете указать количество строк для вывода используя опцию --lines. Например:
sudo systemctl status --lines=50 avahi-daemon
Если на экран не помещается вся строка логов, вы можете использовать стрелки вправо и влево для прокрутки. В некоторых случаях строка может обрезаться по размеру окна терминала. Для того чтобы этого избежать используйте опцию -l:
sudo systemctl status -l nginx
8. Автозагрузка службы
Для того чтобы добавить службу в автозагрузку используйте команду enable. Например, команда добавления Nginx в автозагрузку будет выглядеть вот так:
sudo systemctl enable nginx
А для удаления из автозагрузки используйте команду disable. Например:
sudo systemctl disable nginx
Более подробно об автозагрузке в Systemd вы можете прочитать в статье Автозагрузка сервисов Linux.
9. Редактирование файла службы
Иногда возникает необходимость отредактировать файл службы. Например, для того чтобы добавить дополнительные переменные окружения или настроить автоматический перезапуск. Но редактировать сам файл сервиса в папке /usr/lib или /lib не желательно, поскольку при следующем обновлении пакета он будет перезаписан.
Вы можете скопировать файл юнита в папку /etc/systemd/system/ и редактировать его там. Специально для таких случаев была разработана команда edit. Если её использовать с опцией --full она создаст файл в папке /etc/systemd/* в котором вы можете изменять всё что вам нужно. Например, вы можете выполнить следующую команду для того чтобы отредактировать конфигурационный файл Nginx:
sudo systemctl edit --full nginx
Внесите нужные изменения и сохраните файл. Например, можно добавить переменную окружения SITE со значением losst:
Если же вы выполните команду edit без опции --full, то будет создана папка /etc/systemd/system/nginx.service.d, в которой появится файл override.conf. Здесь нужно разместить только параметры, которые вы хотите добавить или значения которых нужно переопределить Например, для добавления той же переменной окружения нужно добавить такую строку:
sudo systemctl edit nginx
После внесения изменений необходимо обновить конфигурацию Systemd с диска:
sudo systemctl daemon-reload
Затем вы можете перезапустить сервис и убедится, что настройки применились.
10. Удаление службы
Удалить службу можно удалив пакет, вместе с которым она поставляется. Однако если это стандартная служба, то это сделать не получится. Существует способ отключать юниты, если вы не хотите чтобы кто-то их использовал. Это маскировка. Для этого используйте команду mask:
sudo systemctl mask имя_сервиса
Например, для Nginx:
sudo systemctl mask nginx
Эта команда создает в папке /etc/systemd/system символическую ссылку на /dev/null с именем файла службы, после чего служба считается отключённой. Обратите внимание, что если вы редактировали файл юнита и в папке /etc/systemd/system уже существует его файл, то вы можете получить ошибку Failed to mask unit: File /etc/systemd/system/*.service already exists. В таком случае все ваши изменения нужно удалить командой revert. При выполнении этой команды ваши изменения будут удалены. Например:
sudo systemctl revert nginx
Информацию о том, что служба замаскирована можно увидеть в выводе команды status:
sudo systemctl status nginx
Для того чтобы вернуть всё как было выполните команду unmask:
sudo 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
Выводы
Теперь управление службами Linux не вызовет у вас проблем. Много чего мы упустили, systemd - очень большая, сложная и многофункциональная система, которую не охватить в одной статье. Но я думаю, что все, что касается управления службами Linux мы разобрали. Если у вас остались вопросы, спрашивайте в комментариях!
Нужно бы поправить: "socket - сокет для взаимодействия между процессами".
Это не сокет, а сервис сокетной активации, взамен суперсерверов inetd или xinetd.
Есть такой хороший перевод : http://www2.kangran.su/~nnz/pub/s4a/s4a_latest.pdf - >100 стр.
Спасибо, подправлю.
могу ошибаться, но timer не относится к типам служб???
Да, это тип юнита, как и другие не .service, но я решил указать его в статье, чтобы так сказать охватить тему более шире.
Хорошая статья, а будет статья про создание своего юнита? к примеру для выполнения какого либо самописного скрипта при загрузке.
Я не знаю есть ли смысл об этом писать, в в интернете и так все очень подробно расписано.
Так то оно так, но лично моё мнение лишним не будет.
Поддерживаю. В интернете много всего, но на losst как-то оно доходчиво получается, да и всё в одном месте.
Можно также сделать ссылку на следующую статью, или цикл статей.
а есть ли какой-либо графический пакет для управления службами systemd - для ubuntu
ранее были bum, sysv-rc-conf а теперь их нет ....
доброго дня
не совсем что не так - посмотрите пожалуйста - я новичок
http://rgho.st/8zSqrNnsC
снимок экрана
Не нужно писать application.
Автор, подскажите как найти и отключить звуковую службу? ПРохожу обучение - это одно из заданий. Но кроме sound.target ничего не нашел, и она особо то не отключается, из автозагрузки не уходит, я перезапускаю - звук все равно есть.
pulseaudio, alsa
Спасибо автору за прекрасный обзор. Прошу только перед публикацией статей текст вставлять хотя бы в Word для синтаксического и грамматического контроля. Ну очень много ошибок. К материалу нет вопросов, но впечатление портится. Извините за критику...
Графическая утилита для управления конфигурацией systemd — SystemdGenie
https://github.com/KDE/systemdgenie
Стал рыться в системе и нашел, что помима *.service есть еще и *.mount .
Что такое wants файлы и в чем отличие от service файлов?
Спасибо!
/etc/systemd/system/ rescue.target.wants
snap-core18-2667.mount
Поправьте в статье не umask на uNmask
Очередная чушь для любителей systemd если у Вас devuan или antix эта статья не для Вас.
Объясните, когда для запуска служб используется команда
systemctl start имя_службы
а когда
servise имя_службы start
Это разные системы инициализации? очень много мануалов,
включая Debian и Ubuntu, где используется именно 'servise'.
Возможно это устаревшие мануалы?
systemctl, это systemd. service, это init.d
systemd более современный, используйте его