Jak napisać systemd .service plik z uruchomionymi plikami systemd-tmp

16

Muszę uruchomić systemd-tmpfiles --createpodczas procesu rozruchu z dystrybucją systemową. Więc muszę utworzyć systemowy plik .service wykonujący tę pracę.

W tym pytaniu możesz przeczytać wszystkie szczegóły na temat tego, czego potrzebuję i dlaczego: Jak działa systemd-tmpfiles?

Przeczytałem o tym kilka dokumentów i piszę następujący test:

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

Ale nie jestem pewien, ponieważ systemd-tmpfilesnie jest to prosty program, ale sam element systemowy. Nie chciałbym zepsuć mojego systemu.

Wszelkie wskazówki dotyczące prawidłowego pliku .service?

eang
źródło
Sprawdź obszerną dokumentację systemud na stronie freedesktop.org/wiki/Software/systemd . Możesz zastąpić ustawienia domyślne systemu własnymi plikami.
vonbrand

Odpowiedzi:

30

[Nie dotyczy to bezpośrednio pliku systemd-tmpfiles, ale myślę, że już wiesz, że w tym konkretnym przypadku lepiej jest użyć echa.]

Po pierwsze, „multi-user.target” może, ale nie musi być tym, czego chcesz używać. Jeśli znasz koncepcję poziomów uruchamiania z elementów inicjujących w stylu SysV, wielu użytkowników jest systemowym odpowiednikiem poziomu pracy 3, który jest systemem dla wielu użytkowników, który uruchamia się na konsoli, a nie GUI. Odpowiednikiem poziomu uruchamiania 5, który uruchamia się do X, jest program graficzny . Wartość domyślna jest określona przez dowiązanie symboliczne w /etc/systemd/system(i / lub /lib/systemd/system; ten w /etczastąpi ten w /lib) o nazwie default.target , użyj ls, aby znaleźć miejsce, w którym wskazuje:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

Dla normalnych komputerów z linuksem będzie to grafika. Cel. Nie jest to tak naprawdę ważne, jeśli chcesz, aby usługa rozruchowa, którą tworzysz, uruchamiała się niezależnie od domyślnego poziomu uruchamiania / celu - w takim przypadku możemy po prostu użyć default.target i nie martw się, po co to jest alias. Jeśli jednak używasz wielu użytkowników, a domyślnie jest to grafika, usługa nie będzie dostępna.

W zależności od usługi mogą istnieć bardziej odpowiednie i określone cele lub usługi, od których chcesz uruchomić ten w związku z usługą. W oparciu o inne pytanie default.target prawdopodobnie jest w porządku. Uwaga: różnica między „celem” a „usługą” polega na tym, że usługa zawiera [Service]sekcję, która faktycznie uruchamia proces; cel jest po prostu sposobem grupowania usług za pomocą różnych dyrektyw „zależnych” i „wymagających”; nie robi nic poza wyzwalaniem innych celów lub usług.

Uruchomienie usługi zależy od tego, jakie inne usługi wyraźnie od niej zależą. W przypadku prostego, samodzielnego zdarzenia, takiego jak to, które chcemy uruchomić późno w procesie rozruchu, możemy użyć tej kombinacji dyrektyw:

[Unit]
After=default.target

[Install]
WantedBy=default.target

Sekcja „Instaluj” jest używana podczas instalowania usługi; „WantedBy” określa cel, do którego chcemy dołączyć tę usługę (co oznacza, że ​​będzie działać, jeśli ten cel się spełni, ale nie. Nie określa to, kiedy będzie działać w stosunku do innych ). Ponieważ tak naprawdę chcemy, aby ta usługa działała później niż wcześniej, określamy klauzulę „Po”. To niekoniecznie musi być taki sam, jak cel WantedBy (zwykle nie jest) i można go całkowicie pominąć, jeśli nie obchodzi Cię, kiedy to się stanie; Używam tego tylko przy przeczuciu, że większość innych rzeczy będzie działać w stosunku do rzeczy, które są gdzieś powiązane z czymś określonym Before=default.target(co mogliśmy również wykorzystać; potrzeby celu są oceniane przed uruchomieniem celu).

Na przykład po prostu powtórzę „hello world” na konsoli. Sama usługa jest opisana w [Service]sekcji:

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

Polecenie wymaga pełnej ścieżki. Powodem, dla którego nie tylko użyłem, /usr/bin/echo "hello world"jest to, że nie zadziała (myślę, że dane wyjściowe idą do / dev / null), a podczas gdy usługa wykonująca echo "hello world" > /dev/consoletestament, eksperymenty pokazują, że użycie przekierowania powłoki w dyrektywie ExecStart nie będzie . Tak / usr / local / bin / helloworld jest skryptem powłoki z tej jednej linii echo "hello world" > /dev/console.

Zwróć uwagę na to Type=forking, co jest konieczne dla skryptu powłoki.

Nasza kompletna, minimalny plik obsługa jest po prostu te trzy sekcje ( [Unit], [Service], i [Install]). Aby zainstalować, umieść do niego plik lub dowiązanie symboliczne w / etc / systemd / system lub / usr / lib / systemd / system i:

systemctl --system enable helloworld

Powinien wydrukować ln -s .... To nie uruchamia usługi, po prostu konfiguruje ją do uruchamiania podczas rozruchu, jak omówiono powyżej.

To w skrócie. man systemd.uniti man systemd.servicemieć więcej szczegółów.

Złotowłosa
źródło
1
Dziękuję, bardzo przydatna odpowiedź i problem rozwiązany. Tylko uwaga, w mojej dystrybucji (Chakra Linux) default.targetnie ma /etc/systemd/system, ale jest tylko w/usr/lib/systemd/system
eang
Dane wyjściowe z komend są rejestrowane (gdzie indziej mogłyby się udać)?
vonbrand
Pliki / usr / lib / systemd / ... są awaryjne (domyślnie), należy upuścić swoje pliki w / etc / systemd / ...
vonbrand
Te dni default.targetmożna znaleźć w/lib/systemd/system/default.target
czerasz
1
@czerasz Zwracam uwagę na Fedorę 27, jeśli systemctl set-default ...zostawiam dowiązanie symboliczne /etc/systemd/system, ale nie zmienia tego w /lib, tzn. wskazują inne cele, ale rzeczy w pierwszym powinny zastąpić drugie. Jeśli sam to ustawisz, może się zdarzyć. W każdym razie edytowałem w obu lokalizacjach.
goldilocks,
2

W przypadku usługi systemd-tmpfiles: powinna być dostarczana z Twoją dystrybucją, ale zawsze możesz pobrać plik usługi z wcześniejszego repozytorium git

SimonPe
źródło