systemd jest menedżerem zadań. Strona podręcznika nie jest bardzo precyzyjna, jak to działa.
Podczas uruchamiania systemd buduje transakcję składającą się z zadań dla zadania zakotwiczenia (tj. Uruchom zadanie dla default.target). Wszystkie te zależności i relacje określają, w jaki sposób i jakie zadania będą uruchamiane. Zamówienie określa, na jakie zadania będą czekać wszystkie inne zadania. Jednostka default.target znajduje się więc w centrum tego wszystkiego, dlatego podczas włączania jednostek używasz odwrotnej zależności, która poprzez systemctl enable tworzy symboliczne łącze systemu plików oznaczające zależność przekazywania, którą może śledzić system (także dlaczego potrzebujesz symlinks systemu plików w pierwsze miejsce). Podobnie jest, gdy ręcznie uruchamiasz jakąś jednostkę, wtedy ta jednostka jest kotwicą, a transakcja jest obliczana na jej podstawie.
Nie wchodząc w zbyt szczegółowe szczegóły, wyjaśnię, co robi Wymaga = i Po =.
Wymagane = spowoduje, że systemd wyzwoli zadanie początkowe dla wymaganej jednostki, gdy zostanie uruchomione zadanie początkowe (jawnie lub poprzez zależność: nie ma wewnętrznego rozróżnienia). Ma również właściwość wyzwalania zadania zatrzymania, gdy urządzenie zostanie zatrzymane (uwaga: zatrzymane, nie spada samo) lub uruchomione ponownie. Oznacza to, że jeśli jakaś zależność / systemctl powoduje zatrzymanie / ponowne uruchomienie, również zatrzymasz / uruchomisz ponownie. Jeśli jednak upadnie samo z siebie, nie przestaniesz, ponieważ nie było pracy, a zmiana stanu nastąpiła bez udziału systemu. Właśnie tam użyłbyś BindsTo = (podobnie do jednostek urządzeń, które z oczywistych powodów mogą stać się nieaktywne bez udziału systemd).
Teraz zaleca się użycie opcji After =, ponieważ Wymaga samej = jest to rozsądne rozwiązanie: anuluj wymaganie, jeśli zadanie początkowe nie powiedzie się. To anulowanie działa jednak tylko dla zadań wrt, tj. Jeśli druga jednostka nie definiuje kolejności, systemd wyzwala oba równolegle, a jeśli jego zadanie początkowe zakończy się przed zakończeniem się niepowodzeniem, nie zostanie anulowane (w rzeczywistości nie można go anulować) . Użycie opcji Po = oznacza, że inne zadanie czeka aż do zakończenia zadania początkowego wymaganej jednostki, aw zależności od wyniku, jeśli się nie powiedzie, zadanie oczekujące na uruchomienie urządzenia zostanie anulowane z wynikiem zadania JOB_DEPENDENCY (dlaczego używasz żółtego [DEPEND] przy rozruchu w takich przypadkach). Dlatego ten efekt unieważnienia jest nieokreślony bez użycia After =.
Dlatego użycie Wants = without After = jest w porządku, jeśli nie chcesz czekać na uruchomienie drugiej jednostki: ponieważ nie ma tam żadnego unieważnienia, więc nie ma wyścigu. W takim przypadku jest to jedynie mechanizm synchronizacji.
Możesz także włączyć oba podczas rozruchu i nie wymagać od siebie nawzajem, i definiować tylko porządkowanie, w takim przypadku, gdy oba zostaną pobrane w ramach tej samej transakcji, zostaną zamówione (lub jeśli zadanie dla drugiego zostanie uruchomione podczas gdy zadanie dla jednostki, którą chce uruchomić, jest uruchomione, najpierw zaczeka na zakończenie, między transakcjami).
Teraz, jeśli nie ma pracy, zamówienie nie ma wpływu na wspomnianą jednostkę. Zazwyczaj jednak istnieje zadanie, w wyniku użycia zależności takich jak Wymaga = i Chce = lub obie są wciągane na raz i definiują pewne porządkowanie, w którym to przypadku czekają na zadania innej jednostki.