systemd - Podawanie mojej usłudze wielu argumentów

44

Czy można podać mojej usłudze systemowej więcej niż jeden argument?

Chciałbym uruchomić program z wieloma argumentami, o których decyduje użytkownik końcowy.

Na przykład: ./program arg1 arg2

Na początek potrzebuję aplikacji z jednym argumentem systemctl start arg1@program, gdzie w definicji usługi mam ExecStart = /usr/bin/program ℅i.

Dzięki!

peperunas
źródło
1
Wygląda na to, że chcesz to plik konfiguracyjny.
Daniel B
Muszę to zmienić w drodze. Czy ściśle potrzebuję pliku conf?
peperunas
@peperunas nie potrzebujesz pliku conf, zobacz moją odpowiedź, która działa bez żadnych dodatkowych plików
nonagon

Odpowiedzi:

34

Tak, możesz! Zdefiniuj je gdzieś w pliku i dodaj do EnvironmentFileusługi systemowej. Powiedzmy na przykład, że zawartość /etc/.progconf to:

ARG1=-o
ARG2=--verbose

A twój plik .service:

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

Możesz napisać do tego pliku, jeśli chcesz je zmienić w drodze. Usługa nie powinna zbyt często zmieniać swoich opcji, może warto rozważyć autostart lub cron, jeśli trzeba to osiągnąć.

Aby uzyskać więcej przykładów, sprawdź: https://wiki.archlinux.org/index.php/Systemd/Services

platforma
źródło
Heh, całkiem przydatny, nie myślałem o tym. Muszę się jednak zgodzić: parametry usługi nie zmieniają się regularnie, podobnie jak ich pliki konfiguracyjne.
Daniel B
jeśli plik usługi używa zmiennych środowiskowych, czy możesz powiedzieć, że VAR1=... VAR2=... systemctl start foobar.serviceprzekazujesz zmienne?
Johannes Schaub - litb
Tak, wierzę, że możesz
platforma
6
@ JohannesSchaub-litb, nie, nie możesz. Istnieje PassEnvironmentdyrektywa, ale pobiera zmienne z systemdprocesu (zwykle PID 1), a nie z systemctl. Zmienne środowiskowe z systemctlprocesu nie są propagowane do uruchamianej usługi.
cjm
2
Ale upstart może uruchamiać wiele instancji tej samej usługi z różnymi parametrami. Na przykład serwer pocztowy na eth0 i inne wystąpienie wspomnianego serwera pocztowego na eth1, przekazując parametr do uruchomienia i zarządzając nimi jako osobne usługi. Czy systemd może to zrobić?
LtWorf
15

Chciałem zrobić to samo, ale bez osobnego pliku dla każdej kombinacji argumentów. Odkryłem, że mogę przekazać jeden długi argument ze spacjami, a następnie użyć funkcji dzielenia przestrzeni zmiennych środowiskowych systemd, aby oddzielić argumenty.

Zrobiłem usługę z nazwą pliku [email protected]( zwróć uwagę na znak „na znak”, który jest wymagany, gdy usługa przyjmuje argumenty ).

[Unit]
Description=Test passing multiple arguments

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

Uruchamiam to z sudo systemctl start argtest@"arg1 arg2 arg3".servicei przechodzi arg1, arg2i arg3jako osobne argumenty wiersza poleceń do test.py.

nonagon
źródło
„zwróć uwagę na znak ampersand”: w twojej odpowiedzi nie znalazłem znaku ampersand. Czy możesz edytować swoją odpowiedź, aby była bardziej zrozumiała w tym punkcie?
Patrick Mevzek,
Tak, przepraszam za to!
nonagon
Myślę, że @ jest potrzebne tylko wtedy, gdy używasz% I tak jak ty. To instancja usługi.
Toby
Zgadzam się, natknąłem się na kilka postów na blogu, które to pominęły. Wyjaśnię w mojej odpowiedzi.
nonagon
To nie wydaje się działać z poziomu innej usługi. Próbowałem Wants=argtest@"arg1 arg2".servicei tylko pierwszy argument został przekazany.
Roger Dueck
1

Najłatwiejszy do znalezienia to:

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

Utrzymuje wszystko w spokoju.

Powiedziawszy to, znalazłem, że przynajmniej na Ubuntu 18.04 LTS, nawet nie muszę tego robić, mogę to zrobić i działa dobrze:

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

$vars pracować również jako argumenty z tym wzorcem.

jjxtra
źródło