Uruchomić usługę systemd po określonej usłudze? [Zamknięte]

85

Mam ogólne pytanie. Jak można uruchomić jednostkę systemową *.servicepo *.servicepomyślnym uruchomieniu określonego elementu ?

Bardziej szczegółowe pytanie brzmi: jak mam zacząć website.servicedopiero po mongodb.servicerozpoczęciu? Innymi słowy, website.servicepowinno polegać na mongodb.service.

jww
źródło
1
To pytanie należy do ServerFault, prawda?
Rémi,
1
@ Rémi jest w porządku na obu stronach! :)
Anonymous Penguin
2
@AnonymousPenguin Nie, po prostu minęło 3,5 roku, zanim odpowiedziałeś, to nie jest pytanie na temat dla SO. Nie chodzi o programowanie. SF lub, lepiej, Unix / Linux.SE byłby znacznie bardziej odpowiedni.
underscore_d
Stack Overflow to witryna zawierająca pytania dotyczące programowania i programowania. To pytanie wydaje się być niezwiązane z tematem, ponieważ nie dotyczy programowania ani programowania. Zobacz, o jakie tematy mogę zapytać w Centrum pomocy. Być może lepszym miejscem do zadawania pytań będzie Super User lub Unix & Linux Stack Exchange .
jww

Odpowiedzi:

118

W pliku .service w sekcji [Jednostka]:

[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

Ważną częścią jest mongodb.service

Strona podręcznika opisuje to jednak ze względu na formatowanie nie jest tak jasne na pierwszy rzut oka

systemd.unit - dobrze sformatowany

systemd.unit - niezbyt dobrze sformatowany

LW001
źródło
1
Nasza usługa mongod uruchamia bardzo dużą bazę danych. Kolejna usługa nie uruchamia się poprawnie, ponieważ wydaje się, że ładowanie bazy danych po uruchomieniu mongo zajmuje więcej czasu. Więc nasza druga usługa uruchamia się, ale kończy się niepowodzeniem, ponieważ mongo zostało pomyślnie uruchomione, ale nie załadowało bazy danych. Może opóźnienie mogłoby pomóc ...
przyszłości
Czy systemd service może obsłużyć następujące scenariusze? Rozważ wiele usług A, B, C, D. Jeśli A istnieje Chcę, aby B, C, D zaczęły się dopiero po A, w przeciwnym razie, jeśli A nie istnieje, B, C, D mogą rozpocząć się w dowolnej kolejności. Proszę o pomoc
achilles
@achilles Czy możesz stworzyć fałszywą usługę A w systemach, w których A nie jest potrzebne. W ten sposób zależności B, C, D mogą być proste.
Walter A
50

After=zależność jest skuteczna tylko wtedy, gdy usługa obejmująca usługi After=i usługa uwzględniona przez After=są zaplanowane jako część rozruchu.

Dawny:

a.service
[Unit]
After=b.service

W ten sposób, jeśli oba a.servicei b.servicewłączone , systemd złoży kolejność b.servicepo a.service.

Jeśli się nie mylę, pytasz, jak zacząć, b.servicegdy a.serviceuruchamia się, mimo że b.servicenie jest włączony.

Dyrektywa w tym zakresie jest Wants=lub Requires=pod [Unit].

website.service
[Unit]
Wants=mongodb.service
After=mongodb.service

Różnica pomiędzy Wants=i Requires=jest to, że z Requires=, awaria zacząć b.servicespowoduje uruchomienie a.servicesię niepowodzeniem, natomiast z Wants=, a.servicerozpocznie nawet jeśli b.servicenie powiedzie się. Jest to szczegółowo wyjaśnione na stronie podręcznika systemowego.unit .

Umut
źródło
8
Uważam, że prawda jest dokładnym przeciwieństwem tej odpowiedzi. After=website.serviceoznacza „wykonaj moją jednostkę po witrynie.serwis!”. To jest wyjaśnione w dokumentacji: „After = zapewnia, że ​​skonfigurowana jednostka zostanie uruchomiona po zakończeniu uruchamiania wymienionej jednostki” . Zakładam, że „wymienione jednostki” to jednostki po prawej stronie „After =”.
Sindarus
„W ten sposób, jeśli zarówno a.service, jak i b.service są włączone, systemd zamówi b.service po a.service”. swap(a, b)
Mateen Ulhaq