Что такое сервисный файл?
⠀Зачастую, можно встретить определение «сервисный файл», служба или 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
, основной функционал которых будет рассмотрен позже.
⠀Настоятельно рекомендуем и сами в гайдах стараемся запускать все ноды в виде сервисных файлов, поскольку это удобно:
- Работа в фоновом режиме
- Запуск вместе с системой
- Удобное управление (запуск, остановка, перезапуск и т. д.)
- Юнит/служба — программа, работающая в фоновом режиме, без взаимодействия с пользователем;
- Сервисный файл/сервис — наиболее часто используемый тип юнита;
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
(будут рассмотрены позже)
Взаимодействие с сервисным файлом
Создание
⠀Как для создания так и для изменения существующего сервисного файла используется команда
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
Читать далее
⠀Если готовы углубиться в изучение сервисного файла и узнать о наиболее полезных параметрах, то прочтите статью для продвинутых.
Полезные команды
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
Полезные ссылки
Управление службами | Подробнее о journalctl
Благодарности
Команда 1package — написание статьи