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!


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


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 argtest@.service( 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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.