GNU/Linux >> Tutoriels Linux >  >> Linux

Rendre le service utilisateur systemd dépendant de la cible système

J'avais le même problème, avec un script de sauvegarde userland nécessitant un accès à Internet. Je l'ai résolu en ajoutant ~/.config/systemd/user/wait-for-network.service qui ping juste google.com jusqu'à ce qu'il soit accessible :

[Unit]
Description=Ping a server on the internet until it becomes reachable

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'while ! ping -c1 google.com; do sleep 1; done'
TimeoutStartSec=60s

Ensuite, j'ai fait en dépendre mon script de sauvegarde comme ceci :

[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service

Cela fonctionne que vous utilisiez ou non NetworkManager ou tout autre moyen d'établir la connexion.


Oubliez le network.target . man systemd.special dit :

network.target
       systemd automatically adds dependencies of type After for
       this target unit to all SysV init script service units
       with an LSB header referring to the $network facility.

Donc, cette cible est principalement un hack de compatibilité pour les scripts d'initialisation SysV.

En supposant que votre connexion réseau est gérée par NetworkManager, vous aviez bien sûr raison de dépendre de cette cible car NetworkManager.service définit Before=network.target . Mais cela signifie seulement que NetworkManager a été démarré, pas que la connexion réseau est réellement établie. Cela peut prendre un certain temps (allers-retours DHCP, poignée de main wifi, etc.) et est entièrement l'affaire de NetworkManager. Au moins sur mon système (F18) il y a un service appelé NetworkManager-wait-online . Il utilise le nm-online programme utilitaire à bloquer jusqu'à ce qu'une connexion active soit établie. Essayez de Require, Before cela dans votre définition d'unité ou utilisez cet outil seul.


Linux
  1. Comment arrêter le service systemd

  2. systemd - Donner à mon service plusieurs arguments

  3. Comment exécuter un script avec systemd juste avant l'arrêt ?

  4. utiliser des minuteries systemd au lieu de cron

  5. Le système refuse SSH et reste bloqué au "démarrage" après l'installation de systemd

Commandes Systemctl pour gérer le service Systemd

Gestion des cgroups avec systemd

Comment changer d'utilisateur pour un groupe de fichiers de service Systemd ?

Pourquoi la plupart des exemples Systemd contiennent-ils Wantedby=multi-user.target ?

SystemD - A quoi sert SystemD ?

Comment faire d'un utilisateur un administrateur dans Debian 11