systemd - предоставление моего сервиса нескольких аргументов

46

Можно ли предоставить моему сервису systemd более одного аргумента?

Я хотел бы выполнить программу с несколькими аргументами, которые должны быть определены конечным пользователем.

Например: ./program arg1 arg2

Чтобы запустить приложение с одним аргументом, мне нужно что-то вроде того systemctl start arg1@program, где в определении сервиса есть ExecStart = /usr/bin/program ℅i.

Благодарность!

peperunas
источник
1
Похоже, что вы хотите, это файл конфигурации.
Даниэль Б
Мне нужно изменить это на ходу. Мне строго нужен файл conf?
peperunas
@peperunas вам не нужен файл conf, посмотрите мой ответ, который работает без каких-либо дополнительных файлов
nonagon

Ответы:

36

Да, ты можешь! Определите их в файле где-нибудь и добавьте EnvironmentFileв свою службу systemd. Например, скажите, что содержимое /etc/.progconf:

ARG1=-o
ARG2=--verbose

И ваш файл .service:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

Вы можете написать в этот файл, если вам нужно изменить их на ходу. Служба не должна менять свои параметры очень часто, возможно, стоит подумать об автозапуске или cron, если вам нужно это сделать.

Для дополнительных примеров проверьте: https://wiki.archlinux.org/index.php/Systemd/Services

Platforma
источник
Хех, довольно удобно, не думал об этом. Я должен согласиться, хотя: параметры службы не меняются на регулярной основе, как и их конфигурационные файлы.
Даниэль Б,
если служебный файл использует переменные окружения, можете ли вы VAR1=... VAR2=... systemctl start foobar.serviceпередать переменные?
Йоханнес Шауб - Lit
Да, я верю , что можно
Platforma
6
@ JohannesSchaub-litb, нет, ты не можешь. Существует PassEnvironmentдиректива, но она принимает переменную из systemdпроцесса (обычно PID 1), а не из systemctl. Переменные среды из systemctlпроцесса не распространяются на запускаемую службу.
CJM
2
Но upstart может запускать несколько экземпляров одного и того же сервиса с разными параметрами. Например, почтовый сервер на eth0 и другой экземпляр упомянутого почтового сервера на eth1, передавая параметр в upstart и управляя ими как отдельными службами. Может ли systemd сделать это?
LtWorf
15

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

Я сделал сервис с именем файла argtest@.service( обратите внимание на конечный знак «at sign», который требуется, когда сервис принимает аргументы ).

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

Я запускаю это с sudo systemctl start argtest@"arg1 arg2 arg3".serviceи он проходит arg1, arg2и arg3как отдельные аргументы командной строки для test.py.

девятиугольник
источник
«обратите внимание на конечный амперсанд»: в вашем ответе нет амперсанда. Можете ли вы отредактировать свой ответ, чтобы быть более ясным по этому вопросу?
Патрик Мевзек,
Да, извините за это!
nonagon
Я думаю, что @ нужен только тогда, когда вы используете% I, как вы. Это экземпляр сервиса.
Тоби
Согласился, я просто наткнулся на несколько постов в блоге, в которых его не было. Я уточню в своем ответе.
nonagon
Кажется, это не работает из другого сервиса. Я попытался, Wants=argtest@"arg1 arg2".serviceи только первый аргумент был принят.
Роджер Дуек
1

Самый простой, который я нашел, это:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

Сохраняет все это самодостаточным.

Сказав это, я обнаружил, что по крайней мере на Ubuntu 18.04 LTS мне даже не нужно этого делать, я могу это сделать, и он отлично работает:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars работать как аргументы с этим шаблоном.

jjxtra
источник