Wie kann ich einen systemd-Dienst beim Start starten, bevor ein anderer systemd-Dienst gestartet wird?

9

Ich verwende Ubuntu 16.04 auf einem alten HP Laptop

Ich habe eine Software darauf installiert, um einen kleinen hausgemachten Plex-Server zu erstellen. Ich habe Sonarr, Radarr, Deluge, Jackett usw. usw. installiert und alle werden beim Start automatisch gestartet!

Vor ein paar Tagen habe ich beschlossen, auch rclone zu installieren, und ich habe (dank eines GitHub-Projekts) einige Ordner erstellt, die bei jedem Start durch Starten eines Skripts bereitgestellt werden müssen (ich starte es über das Schreiben von Terminals sudo ~/bin/check.mount). Sonarr und Radarr sind so eingerichtet, dass sie Inhalte per Flut in einen temporären Ordner herunterladen und dann in einen dieser beiden bereitgestellten Ordner exportieren.

Das Problem ist, dass Sonarr / Radarr zum Zeitpunkt des manuellen Starts des Skripts bereits aktiv sind und ihre Stammordner nicht finden können. Daher wird mir ein Fehler angezeigt.

Ich möchte einen mountgdrive.service (Service oder was auch immer erforderlich ist) erstellen, um das check.mount-Skript automatisch zu starten, und, falls dies nicht ausreicht, eine Verzögerung in sonarr.service und radarr.service einfügen! Ist das möglich?

Ich habe das mit geschrieben 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

und so zu sonarr.service und radarr.service mountgdrive.servicein dem After=Bit hinzugefügt

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

[Service]
User=samsepioldoresh4ze
etcetc
....

Aber es funktioniert nicht! Sonarr und Radarr starten normal, aber die Laufwerke sind nicht montiert! Was mache ich falsch?


Außerdem funktioniert rtcwake auf meinem Laptop nicht - ich denke, es ist ein Kernelproblem?! Gibt es eine Möglichkeit, das zu beheben?

samsepioldoloresh4ze
quelle
1
Wenn ich es richtig verstehe, möchten Sie sonarr.serviceund radarr.servicedanach laufen, mountgdrive.serviceist es in Betrieb?
Dan
@ Dan genau! Das Problem ist, die Art und Weise, wie ich es geschrieben habe, mountgdrive.serviceläuft anscheinend , tut aber nichts (es mounten die Laufwerke nicht) sonarr.serviceund radarr.serviceläuft dann normal, weil Ubuntu ausgeführt wirdmountgdrive.service
samsepioldoloresh4ze
1
Ich würde Ihnen auch empfehlen, sich .mountEinheiten anzusehen . Wenn Sie mountgdrive.servicelediglich ein Verzeichnis oder ähnliches bereitstellen, können Sie es möglicherweise in einen .mountDienst ändern . Da es es besonders zuverlässig macht, da Sie Abhängigkeiten davon haben.
Dan

Antworten:

26

Der Grund, warum Sie dieses Problem haben, ist, dass Sie verwenden, After=während Sie auch Requires=oder benötigen Wants=.

Es gibt 3 Haupteigenschaften zum Verwalten von Abhängigkeiten. Ich werde versuchen, den Unterschied kurz zu erklären, aber Sie finden weitere Details unter [Einheit] Abschnitt Optionen | freedesktop.org

  1. After=

    Diese Option legt nur die Reihenfolge der Einheiten fest und garantiert nicht, dass der Dienst gestartet wurde.

  2. Wants=

    Mit dieser Option kann Ihr Gerät erst gestartet werden, nachdem ein anderes Gerät gestartet wurde. (Egal ob es erfolgreich gestartet wurde oder nicht)

  3. Requires=

    Genau wie dies Wants=jedoch dazu führt, dass Ihr Gerät erst startet, nachdem die Abhängigkeiten erfolgreich gestartet wurden.

Sie können auch die Umkehrung jeder dieser Optionen verwenden.

  1. After= wird umgekehrt von Before=
  2. Wants= wird umgekehrt von WantedBy=
  3. Requires= wird umgekehrt von RequiredBy=

Um Ihr Problem zu beheben, müssen Sie Ihren Mount-Service ändern in:

[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

Oder Sie können Wants=mountgdrive.servicedie sonarr.serviceund radarr.serviceEinheiten hinzufügen .

Sie können dies tun, ohne die Standarddateien zu ändern, indem Sie Folgendes ausführen (Sie müssen dasselbe für Folgendes tun radarr.service):

systemctl edit sonarr.service

Und fügen Sie Folgendes ein:

[Unit]
Wants=mountgdrive.service

Hinweis: Sie können ersetzen Wants=mit Requiresoder WantedBy=mit , RequiredBy=wenn Sie die beiden Dienste nicht wollen , überhaupt zu starten , wenn mountgdrive.servicenicht (Obwohl Wants=in der Regel genug ist und auch in der Dokumentation empfohlen).

BEARBEITEN: Die Optionen WantedByund RequiredBykönnen nur unter dem [Install]Abschnitt verwendet werden. (Danke @Yankee )

Dan
quelle
danke für Wants=und WantedBy=, ich werde sie definitiv benutzen !! Ich erhalte diese Fehlermeldung jedoch, wenn ich den Laptop i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Es scheint einen Fehler im Skript zu geben. Sie können es an der Zeile sehen, die mit endet Can't open /.config/SmokeScreen/smokescreen.conf. Vielleicht haben Sie "~ / .config / ..." in Ihrem Skript. Sie sollten die Tilde ( ~) durch den vollständigen Pfad ersetzen, dh /home/you_user_name/.config/....(oder relative Pfade zu Ihrem Skript verwenden)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - dies ist das check.mount-Skript, also sollte ich alle $ (HOME) und $ (bindir) mit den vollständigen Pfaden ändern? Vielen Dank!
Samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Ja, $HOMEist beim Booten nicht verfügbar, da noch kein Benutzer angemeldet ist.
Dan
Sollte WantedBy=in der [Unit]Sektion sein? Ich dachte, es kann nur rein gehen [Install].
Yankee