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!
Odpowiedzi:
Tak, możesz! Zdefiniuj je gdzieś w pliku i dodaj do
EnvironmentFile
usługi systemowej. Powiedzmy na przykład, że zawartość /etc/.progconf to:A twój plik .service:
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
źródło
VAR1=... VAR2=... systemctl start foobar.service
przekazujesz zmienne?PassEnvironment
dyrektywa, ale pobiera zmienne zsystemd
procesu (zwykle PID 1), a nie zsystemctl
. Zmienne środowiskowe zsystemctl
procesu nie są propagowane do uruchamianej usługi.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 ).Uruchamiam to z
sudo systemctl start argtest@"arg1 arg2 arg3".service
i przechodziarg1
,arg2
iarg3
jako osobne argumenty wiersza poleceń do test.py.źródło
Wants=argtest@"arg1 arg2".service
i tylko pierwszy argument został przekazany.Najłatwiejszy do znalezienia to:
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:
$vars
pracować również jako argumenty z tym wzorcem.źródło