Jak mogę uruchomić usługę systemową podczas uruchamiania przed uruchomieniem innej usługi systemowej?

9

Używam Ubuntu 16.04 na starym laptopie HP

Zainstalowałem na nim trochę oprogramowania, aby stworzyć mały domowy serwer plex. Zainstalowałem sonarr, radarr, potop, jackett itp. I wszystkie uruchamiają się automatycznie podczas uruchamiania!

Kilka dni temu zdecydowałem się również zainstalować rclone i utworzyłem (dzięki projektowi GitHub) kilka folderów, które należy zamontować przy każdym uruchomieniu poprzez uruchomienie skryptu (uruchamiam go przez pisanie terminala sudo ~/bin/check.mount). Sonarr i Radarr są skonfigurowane do pobierania rzeczy przez potop do folderu tymczasowego, a następnie eksportowania go do jednego z tych dwóch zamontowanych folderów.

Problem polega na tym, że do czasu ręcznego uruchomienia skryptu Sonarr / Radarr są już uruchomione i nie mogą znaleźć swoich folderów głównych, więc dają mi błąd.

Chciałbym utworzyć mountgdrive.service (usługa lub cokolwiek jest konieczne), aby automatycznie uruchomić skrypt check.mount i, jeśli to nie wystarczy, wstawić opóźnienie w sonarr.service i radarr.service! Czy to jest możliwe?

Napisałem to z sudo nano /etc/systemd/system/mountgdrive.service

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

i dodałem trochę do sonarr.service i radarr.service, mountgdrive.servicew After=ten sposób

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

Ale to nie działa! Sonarr i Radarr uruchamiają się normalnie, ale napędy nie są zamontowane! Co ja robię źle?


Ponadto rtcwake nie działa na moim laptopie - myślę, że to problem z jądrem ?! Czy istnieje sposób, aby to naprawić?

samsepioldoloresh4ze
źródło
1
Jeśli dobrze rozumiem, chcesz sonarr.servicei chcesz radarr.servicebyć uruchomiony po mountgdrive.serviceuruchomieniu?
Dan
@ Dokładnie! problemem jest sposób, w jaki napisałem to najwyraźniej mountgdrive.servicedziała, ale nic nie robi (nie montować dyski), a następnie sonarr.servicei radarr.servicedziałać normalnie, bo ubuntu straconymountgdrive.service
samsepioldoloresh4ze
1
Poleciłbym również zajrzeć do .mountjednostek . Jeśli wszystko, co mountgdrive.servicerobisz, to podłączenie katalogu lub podobnego elementu, możesz być w stanie zmienić go na .mountusługę. Ponieważ sprawia, że ​​jest bardziej niezawodny, ponieważ masz na nim zależności.
Dan

Odpowiedzi:

26

Przyczyną tego problemu jest to, że używasz go, After=gdy potrzebujesz Requires=lub Wants=.

Istnieją 3 główne właściwości zarządzania zależnościami. Spróbuję krótko wyjaśnić różnicę, ale więcej szczegółów znajdziesz w sekcji Opcje [Jednostka] | freedesktop.org

  1. After=

    Ta opcja ustawia tylko kolejność jednostek, nie gwarantuje, że usługa zakończyła uruchamianie.

  2. Wants=

    Ta opcja umożliwia uruchomienie jednostki dopiero po zakończeniu uruchamiania innej jednostki. (Nie ma znaczenia, czy to się udało, czy nie)

  3. Requires=

    Wants=Jednak tak samo spowoduje to uruchomienie jednostki dopiero po pomyślnym uruchomieniu zależności.

Możesz także użyć odwrotności każdej z tych opcji.

  1. After= jest odwrócony przez Before=
  2. Wants= jest odwrócony przez WantedBy=
  3. Requires= jest odwrócony przez RequiredBy=

Aby rozwiązać problem, musisz zmienić usługę montowania na:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target sonarr.service radarr.service

Lub możesz dodać Wants=mountgdrive.servicedo jednostek sonarr.servicei radarr.service.

Możesz to zrobić bez modyfikowania plików domyślnych, uruchamiając następujące czynności (musisz zrobić to samo dla radarr.service):

systemctl edit sonarr.service

I wstaw następujące:

[Unit]
Wants=mountgdrive.service

Uwaga: Można wymienić Wants=z Requireslub WantedBy=z RequiredBy=, jeśli nie chcesz, aby uruchomić dwie usługi w ogóle, jeśli mountgdrive.servicenie powiedzie się (choć Wants=jest zwykle na tyle, a nawet zalecane w docs).

EDYCJA: Z opcji WantedByi RequiredBymożna korzystać tylko w [Install]sekcji. (Dzięki @Yankee )

Dan
źródło
dzięki Wants=i na WantedBy=pewno ich użyję !! Ten błąd pojawia się jednak po ponownym uruchomieniu laptopa i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Wygląda na to, że w skrypcie wystąpił błąd. Możesz to zobaczyć od linii kończącej się na Can't open /.config/SmokeScreen/smokescreen.conf. Może masz „~ / .config / ...” w skrypcie yoru. Powinieneś zastąpić tyldę ( ~) pełną ścieżką, tj. /home/you_user_name/.config/....(Lub użyć ścieżek względnych do skryptu)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - to jest skrypt check.mount, więc powinienem zmienić wszystkie $ (HOME) i $ (bindir) z pełnymi ścieżkami? Dzięki!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Tak, $HOMEnie jest dostępny w czasie uruchamiania, ponieważ nie ma jeszcze zalogowanego użytkownika.
Dan
Powinny WantedBy=być w [Unit]dziale? Myślałem, że może tylko wejść [Install].
Yankee