Главная >> Система >> Управление службами Linux

Управление службами Linux

В операционной системе 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:

Environment="SITE=losst"

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

sudo systemctl edit nginx Envirnoment="SITE=losst"

После внесения изменений необходимо обновить конфигурацию 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 мы разобрали. Если у вас остались вопросы, спрашивайте в комментариях!

20 комментариев к “Управление службами Linux”

    • Да, это тип юнита, как и другие не .service, но я решил указать его в статье, чтобы так сказать охватить тему более шире.

      Ответить
  1. Хорошая статья, а будет статья про создание своего юнита? к примеру для выполнения какого либо самописного скрипта при загрузке.

    Ответить
  2. а есть ли какой-либо графический пакет для управления службами systemd - для ubuntu
    ранее были bum, sysv-rc-conf а теперь их нет ....

    Ответить
  3. Автор, подскажите как найти и отключить звуковую службу? ПРохожу обучение - это одно из заданий. Но кроме sound.target ничего не нашел, и она особо то не отключается, из автозагрузки не уходит, я перезапускаю - звук все равно есть.

    Ответить
  4. Спасибо автору за прекрасный обзор. Прошу только перед публикацией статей текст вставлять хотя бы в Word для синтаксического и грамматического контроля. Ну очень много ошибок. К материалу нет вопросов, но впечатление портится. Извините за критику...

    Ответить
  5. Стал рыться в системе и нашел, что помима *.service есть еще и *.mount .
    Что такое wants файлы и в чем отличие от service файлов?
    Спасибо!

    /etc/systemd/system/ rescue.target.wants
    snap-core18-2667.mount

    Ответить
  6. Объясните, когда для запуска служб используется команда
    systemctl start имя_службы
    а когда
    servise имя_службы start

    Это разные системы инициализации? очень много мануалов,
    включая Debian и Ubuntu, где используется именно 'servise'.
    Возможно это устаревшие мануалы?

    Ответить

Оставьте комментарий