January 19

Введение в службы и сервисы


Введение

Службы (services) в Ubuntu — это фоновые процессы, которые обеспечивают выполнение важных задач и предоставляют системные или пользовательские функции. Примеры служб включают работу веб-серверов, системных журналов, сетевых подключений и других системных компонентов.

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

Различие между systemd и systemctl

  • systemd
    Это система инициализации (init system), которая используется для управления процессами в Linux. Она отвечает за загрузку системы, запуск служб, управление состояниями процессов, мониторинг и журналирование.
    systemd является фоном, работающим на уровне системы, и предоставляет функциональность для управления всеми unit'ами (сервисами, целями, монтированием и т.д.).
  • systemctl
    Это инструмент командной строки, предоставляемый systemd. Он используется для взаимодействия с systemd и управления службами (unit'ами).
    systemctl позволяет запускать, останавливать, перезапускать службы, управлять их автозагрузкой и просматривать их состояние.

Пример различия:

  • systemd — это сама система, которая запускает и управляет службами.
  • systemctl — это инструмент для работы с systemd.

Пример готовой службы

Для наглядности рассмотрим популярную службу nginx, которая используется для работы веб-серверов.

Проверка статуса службы

Чтобы узнать, запущена ли служба:

systemctl status nginx
Сервиса нет и он не запущен
Сервис не работает по какой-то причине
Все ок

Запуск и остановка службы

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

sudo systemctl start nginx

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

sudo systemctl stop nginx

Создание своей службы

Рассмотрим процесс создания собственной службы. В качестве примера создадим службу, которая будет запускать Python-скрипт для записи текущего времени в лог. Все тоже самое можно будет проделать с каким-либо скриптом ноды, который вы будете использовать для запуска ноды

Шаг 1. Создание скрипта

Создаем файл /opt/example_script.py:

sudo nano /opt/example_script.py

Наполнение файла будет следующим

#!/usr/bin/env python3 

import time 
while True: 
    with open("/var/log/example_service.log", "a") as log_file: 
        log_file.write(f"Current time: {time.ctime()}\n") 
    time.sleep(60)

Делаем файл исполняемым:

sudo chmod +x /opt/example_script.py

Теперь мы имеем файл example_script.py, который несет в себе функционал и мы хотим сделать так, чтобы этот файл работал как фоновый процесс

Шаг 2. Создание файла службы

Создаем файл службы в директории /etc/systemd/system/:

sudo nano /etc/systemd/system/example_service.service

Путь /etc/systemd/system/ используется для хранения пользовательских файлов служб. Это место специально предназначено для служб, созданных администратором или настроенных вручную.

Добавляем в него следующий код:

[Unit]
Description=Example Python Service
After=network.target

[Service]
ExecStart=/usr/bin/python3 /opt/example_script.py
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

Разбор кода:

  • [Unit]:
    • Description — описание службы.
    • After — определяет, когда служба должна запускаться (например, после сети).
  • [Service]:
    • ExecStart — команда запуска службы.
    • Restart — указывает, что служба будет перезапускаться в случае сбоя.
    • User и Group — задают пользователя и группу для выполнения службы.
  • [Install]:
    • WantedBy — определяет цель запуска службы (например, multi-user.target — многопользовательский режим).

Шаг 3. Активация и запуск

1) Обновляем список служб:

sudo systemctl daemon-reload

2) Добавляем службу в автозагрузку:

sudo systemctl enable example_service

3) Запускаем службу:

sudo systemctl start example_service

4) Проверьте её статус:

systemctl status example_service

При выводе содержимого нашего файла можем увидеть, что время прописалось в лог, соответственно программа работает

5) Проверим логи

journalctl -u example_service.service

Основные поля при создании службы

При создании файла службы можно настроить множество параметров. Рассмотрим самые важные.

[Unit]

Это общий раздел для описания метаданных и зависимостей службы.

  • Description — краткое описание службы, отображается в выводе systemctl status.
  • After — указывает, что данная служба должна быть запущена после определённого события или другой службы.
  • Requires — обязательные зависимости (служба не будет запущена, если зависимость недоступна).
  • Wants — слабые зависимости (запускаются, если доступны, но не критичны)

[Service]

Этот раздел описывает параметры запуска, выполнения и завершения службы.

  • ExecStart — команда или скрипт, который запускает службу.
  • ExecStop — команда для остановки службы (необязательно).
  • Restart — политика перезапуска службы (например, always, on-failure).
  • User — пользователь, под которым выполняется служба.
  • Group — группа, в контексте которой работает служба.
  • WorkingDirectory — директория, где будет выполняться команда.
  • Environment — переменные окружения для службы.

[Install]

Этот раздел определяет, как служба интегрируется в систему. Он используется для управления автозагрузкой.

  • WantedBy — определяет, при каких условиях служба будет запускаться (например, multi-user.target).

Основные команды для взаимодействия с службами

  • Запуск службы
    • sudo systemctl start имя_сервиса
  • Остановка службы:
    • sudo systemctl stop имя_сервиса
  • Перезапуск службы:
    • sudo systemctl restart имя_сервиса
  • Проверка статуса:
    • systemctl status имя_сервиса
  • Добавление в автозагрузку:
    • sudo systemctl enable имя_сервиса
  • Удаление из автозагрузки:
    • sudo systemctl disable имя_сервиса
  • Просмотр логов:
    • journalctl -u имя_сервиса
Наш телеграмм канал по нодам — https://t.me/g7team_ru
Наш чат по нодам — https://t.me/g7team_chat