systemd - Надання моїй службі декількох аргументів


44

Чи можна надати моїй системній службі більше одного аргументу?

Я хотів би виконати програму з декількома аргументами, які повинен вирішити кінцевий користувач.

Наприклад: ./program arg1 arg2

Щоб запустити це єдиний додаток аргументу, мені знадобиться щось на зразок systemctl start arg1@program, де у визначенні служби я маю ExecStart = /usr/bin/program ℅i.

Дякую!


1
Схоже, що ви хочете - це конфігураційний файл.
Даніель Б

Мені потрібно змінити це на ходу. Мені строго потрібен конф-файл?
пеперуна

@peperunas вам не потрібен файл конф, побачити моя відповідь , який працює без будь - яких додаткових файлів
Дев'ятикутник

Відповіді:


34

Так, ти можеш! Визначте їх у файлі десь і додайте їх EnvironmentFileу свою системну службу. Наприклад, скажімо, що вміст /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


Хе, досить зручно, про це не думав. Я маю згоду погодитися: параметри сервісу не змінюються регулярно, а також не конфігурують їх файли.
Даніель Б

якщо сервісний файл використовує змінні середовища, чи можете ви сказати, VAR1=... VAR2=... systemctl start foobar.serviceщоб передати змінні?
Йоханнес Шауб - ліб

Так, я вірю, що можна
платформа

6
@ JohannesSchaub-litb, ні, ти не можеш. Є PassEnvironmentдиректива, але вона бере змінні з systemdпроцесу (як правило, PID 1), а не з systemctl. Змінні середовища в systemctlпроцесі не поширюються на розпочату послугу.
cjm

2
Але на початку можна запустити кілька примірників однієї служби з різними параметрами. Наприклад, поштовий сервер на eth0 та інший екземпляр згаданого сервера пошти на eth1, передаючи параметр для запуску та керуючи ними як окремими службами. Чи може це зробити системний?
LtWorf

15

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

Я зробив службу з назвою файлу argtest@.service( зверніть увагу на контур "під знаком", який необхідний, коли служба бере аргументи ).

[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.


"зверніть увагу на контурний знак": я не знаходжу в вашій відповіді. Чи можете ви відредагувати свою відповідь, щоб бути зрозумілішою з цього приводу?
Патрік Мевзек

Так, вибачте з цього приводу!
нонагон

Я думаю, що @ потрібен лише тоді, коли ви використовуєте% 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 також працюйте як аргументи з цією схемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.