web-dev-qa-db-fra.com

Comment lancer un service systemd au démarrage avant qu'un autre service systemd ne démarre?

J'utilise Ubuntu 16.04 sur un vieil ordinateur portable HP

J'ai installé un logiciel dessus pour créer un petit serveur plex maison. J'ai installé Sonarr, Radarr, Deluge, Jackett, etc., et ils se lancent tous automatiquement au démarrage!

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

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

Ce que j'aimerais faire, c'est créer un service mountgdrive.service (service, ou 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 ceci 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.service dans le bit After=, 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?

8

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

Il existe 3 propriétés principales pour la gestion des dépendances. Je vais essayer d’expliquer brièvement la différence, mais vous trouverez plus de détails sur Options de la section [Unit] | 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 ça a commencé avec succès ou pas)

  3. Requires=

    Tout comme Wants=, toutefois, votre unité ne démarrera que lorsque les dépendances auront démarré.

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 modifier votre service de montage en:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service
WantedBy=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

Ou vous pouvez ajouter Wants=mountgdrive.service aux unités sonarr.service et 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 le texte suivant:

[Unit]
Wants=mountgdrive.service

Remarque: vous pouvez remplacer Wants= par Requires ou WantedBy= par RequiredBy= si vous ne voulez pas que les deux services démarrent du tout si mountgdrive.service échoue (bien que Wants= soit suffisant et même recommandé dans les docs).

22
Dan