Передача нескольких параметров в systemd service

Почему systemctl не поддерживает передачу параметров напрямую

Команда sudo systemctl start myapp.service -- parameter1 parameter2 не поддерживается напрямую в systemd, так как система управления сервисами systemd ожидает фиксированные команды и параметры, заранее заданные в файле юнита.

Методы обхода для передачи параметров

Метод 1: Использование скрипта-обёртки

Этот метод заключается в создании скрипта, который принимает параметры и передаёт их приложению:

#!/bin/bash
/usr/local/bin/my_app "$@"

Затем создаётся юнит-файл со следующим содержимым:

[Unit]
Description=Пример сервиса со скриптом-обёрткой

[Service]
ExecStart=/usr/local/bin/myapp_wrapper.sh
Restart=always

Теперь сервис можно запускать с параметрами:

sudo systemctl start myapp.service -- parameter1 parameter2

Метод 2: Использование окружения

Параметры можно передавать через переменные среды:

sudo PARAMS="parameter1 parameter2" systemctl start myapp.service

Юнит-файл при этом должен быть настроен следующим образом:

[Unit]
Description=Пример сервиса с параметрами из среды

[Service]
ExecStart=/usr/local/bin/my_app $PARAMS
Environment=PARAMS=""
Restart=always

Метод 3: Использование шаблонных юнитов

Шаблонные юниты позволяют передавать параметры через имя сервиса:

[Unit]
Description=Пример шаблонного сервиса

[Service]
ExecStart=/usr/local/bin/my_app %I
Restart=always

Сервис запускается с параметрами следующим образом:

sudo systemctl start myapp@"param1 param2".service

Здесь %I подставляет строку после символа @ в команду ExecStart.

Метод 4: Использование Override юнита

Если нужно временно изменить параметры запуска, можно использовать команду systemctl edit:

Выполните команду:

sudo systemctl edit myapp.service

В открывшемся редакторе добавьте временный ExecStart с параметрами:

[Service]
ExecStart=/usr/local/bin/my_app parameter1 parameter2

Сохраните изменения и запустите сервис:

sudo systemctl start myapp.service

После завершения работы удалите временные изменения:

sudo systemctl revert myapp.service

Выберите подходящий метод в зависимости от требований вашего приложения и используемой среды. Шаблонные юниты удобны для типовых сценариев, а скрипт-обёртка и метод Override дают больше гибкости для временных настроек.