Что такое сервисный файл?

Let's Node
5 min readSep 16, 2021

Зачастую, можно встретить определение «сервисный файл», служба или Systemd юнит. О том, что это такое, как он выглядит и как с ним взаимодействовать, в этой статье.

Содержание

  • Что такое сервисный файл?
  • Как выглядит сервисный файл?
  • Взаимодействие с сервисным файлом
  • Создание
  • Управление
  • Просмотр логов
  • Полезные команды
  • Полезные ссылки
  • Благодарности

Что такое сервисный файл?

⠀Сервисный файл или сервис — это программа, работающая в фоновом режиме, без взаимодействия с пользователем. Помимо этого возможен автозапуск сервиса при загрузке системы.

⠀Сервисный файл (service) является одним из типов так называемых юнитов (unit) или служб. Помимо сервисов существуют другие типы — target, automount, device, mount, path, scope, slice, snapshot, socket.

⠀Большинство таких юнитов поддерживают работоспособность системы, например:

  • Следят за состоянием системы;
  • Обеспечивают обнаружение и подключение внешних устройств;
  • Позволяют подключаться через SSH.

⠀Помимо системных служб можно создать пользовательские, которые позволят, например, ноде или какой-либо другой программе работать в фоновом режиме и автоматически запускаться вместе с системой.

⠀Для управления юнитами в большинстве дистрибутивов Linux используется система инициализации под названием Systemd (System Daemon).

Дистрибутив Linux — это общее определение операционных систем, использующих ядро Linux и готовых для установки. Например: Ubuntu, CentOS, Debian и т. п.

Система инициализации — это набор скриптов, которые выполняются при загрузке системы.

⠀Systemd отвечает за управление всеми юнитами, работающими в системе, в течение всего времени работы компьютера — от процесса запуска до завершения работы. Процессы всегда запускаются параллельно (насколько это возможно), чтобы загрузка системы занимала как можно меньше времени.

⠀Хранятся юниты в директории

/etc/systemd/system/

⠀Для пользовательского взаимодействия с юнитами используется команда systemctl, а для просмотра логов journalctl, основной функционал которых будет рассмотрен позже.

⠀Настоятельно рекомендуем и сами в гайдах стараемся запускать все ноды в виде сервисных файлов, поскольку это удобно:

  1. Работа в фоновом режиме
  2. Запуск вместе с системой
  3. Удобное управление (запуск, остановка, перезапуск и т. д.)

⠀Для закрепления:

  • Юнит/служба — программа, работающая в фоновом режиме, без взаимодействия с пользователем;
  • Сервисный файл/сервис — наиболее часто используемый тип юнита;
  • Systemd — система, отвечающая за управление всеми службами;
  • systemctl — команда для пользовательского взаимодействия с юнитами;
  • journalctl — команда для просмотра лога юнитов.

Как выглядит сервисный файл?

⠀В качестве примера рассматривается сервисный файл ноды Massa, поскольку в большинстве случаев сервисный файл выглядит именно таким образом

[Unit]
Description=Massa Node
After=network-online.target
[Service]
User=root
WorkingDirectory=/root/massa/massa-node
ExecStart=/root/massa/massa-node/massa-node
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
  • Unit — это раздел, содержащий общую информацию о юните, не зависящую от его типа
  • Description — краткое название юнита
  • After — после чего будет запускаться. В данном случае — после подключения к интернету
  • Service — это раздел, определяющий тип юнита и содержащий необходимую для его работы информацию. В данном случае тип юнита — сервис
  • User — сервисный файл выполняется от имени указанного пользователя
  • WorkingDirectory — директория, из которой выполняется команда запуска программы
  • ExecStart — одна запускаемая команда
  • Restart — при каком типе сигнала выхода повторно запустить внезапно выключившуюся программу (она отправит этот сигнал выхода). В данном случае — при любом
  • RestartSec — время (по умолчанию в секундах) перед повторным запуском сервиса
  • LimitNOFILE — ограничение количества открытых файлов
  • Install — это раздел, содержащий информацию для установки юнита. Его содержимое активируется/деактивируется при выполнении команд systemctl enable/disable (будут рассмотрены позже)
  • WantedBy — текущий юнит может быть запущен после запуска указанных в данном параметре юнитов. В данном случае нода запускается после перехода системы в состояние, когда пользователь может взаимодействовать с командной строкой, т.е. после загрузки системы

⠀Если готовы углубиться в изучение сервисного файла и узнать о наиболее полезных параметрах, то прочтите статью для продвинутых

Взаимодействие с сервисным файлом

Создание

⠀Как для создания так и для изменения существующего сервисного файла используется команда

sudo tee <<EOF >/dev/null /etc/systemd/system/SERVICE_NAME.service
TEXT
EOF

SERVICE_NAME — название сервиса, которое будет использоваться для взаимодействия. Желательно в конце добавлять d (что значит Daemon), поскольку чистое название, например при создании сервисного файла ноды, может в будущем использоваться проектом

TEXT — содержимое сервисного файла, рассмотренное в прошлом разделе

Например, для ноды Massa команда будет выглядеть следующим образом

sudo tee <<EOF >/dev/null /etc/systemd/system/massad.service
[Unit]
Description=Massa Node
After=network-online.target
[Service]
User=root
WorkingDirectory=/root/massa/massa-node
ExecStart=/root/massa/target/release/massa-node
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF

⠀После создания можно добавить службу в автозагрузку

sudo systemctl enable massad

⠀Далее необходимо обновить список служб, чтобы systemd увидел созданную

sudo systemctl daemon-reload

⠀Запустить сервисный файл

sudo systemctl restart massad

⠀Используется именно restart, поскольку он выполняет сначала остановку, а затем запуск. Таким образом он универсален как в случае запуска нового сервисного файла, так и в случае перезапуска изменённого

Управление

⠀Для управления службами используется команда

sudo systemctl OPTIONS COMMAND UNIT1 UNIT2 UNIT3

OPTIONS — параметры, задающие поведение команды (практически не используются)

COMMAND — команда для управления юнитом, наиболее полезные приведены ниже

UNIT1-… — название юнита(ов), к которому(ым) применяется команда. Название massad равнозначно названию massad.service

⠀Запуск

sudo systemctl start massad

⠀Остановка

sudo systemctl stop massad

⠀Перезапуск

sudo systemctl restart massad

⠀Запущен ли юнит?

sudo systemctl is-active massad

⠀Состояние и 10 строк лога юнита

sudo systemctl status massad

⠀Добавить юнит в автозагрузку

sudo systemctl enable massad

⠀Удалить юнит из автозагрузки

sudo systemctl disable massad

⠀Есть ли юнит в автозагрузке?

sudo systemctl is-enabled massad

⠀Вывести содержимое файла юнита

sudo systemctl cat massad

Просмотр логов

⠀Для просмотра логов используется команда

sudo journalctl OPTIONS

OPTIONS — параметры, задающие поведение команды (детально рассмотрены не будут)

⠀Ниже представлен пример команды с оптимальным набором параметров, которая в режиме реального времени отображает 100 строк лога указанного юнита

sudo journalctl -f -n 100 -u massad

Полезные команды

SERVICE_NAME — название сервиса

UNIT — название юнита, например massad или massad.service

Шаблон сервисного файла

sudo tee <<EOF >/dev/null /etc/systemd/system/SERVICE_NAME.service
[Unit]
Description=
After=network-online.target
[Service]
User=$USER
WorkingDirectory=
ExecStart=
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF

⠀Запуск

sudo systemctl start UNIT

⠀Остановка

sudo systemctl stop UNIT

⠀Перезапуск

sudo systemctl restart UNIT

⠀Запущен ли юнит?

sudo systemctl is-active UNIT

⠀Состояние и 10 строк лога юнита

sudo systemctl status UNIT

⠀Добавить юнит в автозагрузку

sudo systemctl enable UNIT

⠀Удалить юнит из автозагрузки

sudo systemctl disable UNIT

⠀Есть ли юнит в автозагрузке?

sudo systemctl is-enabled UNIT

⠀Вывести содержимое файла юнита

sudo systemctl cat UNIT

⠀Просмотр лога юнита

journalctl -n 100 -f -u UNIT

Благодарности

Команда Let’s Node! — написание статьи

Выразить благодарность

--

--