Comment puis-je lancer un service systemd au démarrage avant le démarrage d'un autre service systemd?

9

J'utilise Ubuntu 16.04 sur un ancien ordinateur portable HP

J'ai installé des logiciels dessus pour créer un petit serveur plex maison. J'ai installé sonarr, radarr, déluge, jackett, etc etc et ils se lancent tous automatiquement au démarrage!

Il y a quelques jours, j'ai décidé d'installer rclone également et j'ai créé (grâce à un projet GitHub) quelques dossiers qui doivent être montés à chaque démarrage en lançant un script (je le lance via l'écriture du terminal sudo ~/bin/check.mount). Sonarr et Radarr sont configurés pour télécharger des trucs via déluge dans un dossier temporaire, puis les exporter vers l'un de ces deux dossiers montés.

Le problème est qu'au moment où je lance manuellement le script, Sonarr / Radarr est déjà opérationnel et ne trouve pas leurs dossiers racine, ils me donnent donc une erreur.

Ce que j'aimerais faire, c'est créer un mountgdrive.service (service, ou tout ce qui est nécessaire) pour lancer automatiquement le script check.mount et, si cela ne suffit pas, insérer un délai dans sonarr.service et radarr.service! Est-ce possible?

J'ai écrit avec 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

et ajouté à sonarr.service et radarr.service mountgdrive.servicedans le After=bit, comme ceci

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

[Service]
User=samsepioldoresh4ze
etcetc
....

Mais ça ne marche pas! Sonarr et Radarr démarrent normalement, mais les disques ne sont pas montés! Qu'est-ce que je fais mal?


De plus, rtcwake ne fonctionne pas sur mon ordinateur portable - je pense que c'est un problème de noyau?! Y a-t-il moyen d'arranger ça?

samsepioldoloresh4ze
la source
1
Si je comprends bien, vous voulez sonarr.serviceet radarr.serviceêtre exécuté après qu'il mountgdrive.servicesoit opérationnel?
Dan
@Dan exactement! le problème est, comme je l' ai écrit apparemment mountgdrive.servicecourt mais ne fait rien (il ne monte pas les lecteurs), puis sonarr.serviceet radarr.serviceexécuter normalement parce que ubuntu exécutésmountgdrive.service
samsepioldoloresh4ze
1
Je vous recommande également de regarder dans les .mountunités . Si tout ce que vous mountgdrive.servicefaites est de monter un répertoire ou similaire, vous pourrez peut-être le changer en .mountservice. Comme il le rend plus fiable, d'autant plus que vous en avez des dépendances.
Dan

Réponses:

26

La raison pour laquelle vous rencontrez ce problème est que vous utilisez After=alors que vous avez également besoin de Requires=ou Wants=.

Il existe 3 propriétés principales pour gérer les dépendances. Je vais essayer d'expliquer brièvement la différence, mais vous pouvez trouver plus de détails dans la section [Unité] Options | freedesktop.org

  1. After=

    Cette option ne définit que l'ordre des unités, elle ne garantit pas que le service a fini de démarrer.

  2. Wants=

    Cette option permet à votre unité de démarrer uniquement après le démarrage d'une autre unité. (Peu importe si cela a réussi ou non)

  3. Requires=

    Tout comme Wants=, cependant, cela ne fera démarrer votre unité qu'après le démarrage réussi des dépendances.

Vous pouvez également utiliser l'inverse de chacune de ces options.

  1. After= est inversé par Before=
  2. Wants= est inversé par WantedBy=
  3. Requires= est inversé par RequiredBy=

Pour résoudre votre problème, vous devez changer votre service de montage pour:

[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

Ou vous pouvez ajouter Wants=mountgdrive.serviceaux unités sonarr.serviceet radarr.service.

Vous pouvez le faire sans modifier les fichiers par défaut en exécutant ce qui suit (vous devez faire de même pour radarr.service):

systemctl edit sonarr.service

Et insérez ce qui suit:

[Unit]
Wants=mountgdrive.service

Remarque: Vous pouvez remplacer Wants=par Requiresou WantedBy=par RequiredBy=si vous ne voulez pas que les deux services démarrent du tout en cas d' mountgdrive.serviceéchec (bien que cela Wants=soit généralement suffisant et même recommandé dans les documents).

EDIT: Les options WantedByet RequiredByne peuvent être utilisées que dans la [Install]section. (Merci @Yankee )

Dan
la source
merci pour Wants=et WantedBy=je les utiliserai certainement !! J'obtiens
samsepioldoloresh4ze
1
Il semble y avoir une erreur dans le script. Vous pouvez le voir sur la ligne se terminant par Can't open /.config/SmokeScreen/smokescreen.conf. Vous avez peut-être "~ / .config / ..." dans le script yoru. Vous devez remplacer le tilde ( ~) par le chemin complet, c'est-à-dire /home/you_user_name/.config/....(ou utiliser des chemins relatifs à votre script)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - c'est le script check.mount, donc je devrais changer tous les $ (HOME) et $ (bindir) avec les chemins complets? Merci!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Oui, $HOMEn'est pas disponible au démarrage, car il n'y a pas encore d'utilisateur connecté.
Dan
Devrait WantedBy=être dans la [Unit]section? Je pensais que ça ne pouvait qu'entrer [Install].
Yankee