Что такое сервисный файл?
⠀Зачастую, можно встретить определение «сервисный файл», служба или 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 — написание статьи