Передача нескольких параметров в 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 дают больше гибкости для временных настроек.