GNU/Linux >> Tutoriels Linux >  >> Linux

provoquer l'exécution d'un script après le démarrage de la mise en réseau ?

Je suis relativement nouveau sur systemd et j'apprends son architecture.

En ce moment, j'essaie de comprendre comment faire fonctionner un script shell personnalisé. Ce script doit être exécuté après la couche réseau a démarré.

J'utilise Arch, en utilisant systemd ainsi que netctl.

Pour tester, j'ai écrit un script simple qui exécute simplement ip addr list > /tmp/ip.txt . J'ai créé le fichier de service suivant pour ce script.

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

J'ai ensuite activé le script avec,

systemctl enable test

Au redémarrage, le script s'exécute effectivement, mais il s'exécute avant le démarrage du réseau. En d'autres termes, la sortie dans ip.txt n'affiche aucune adresse IPv4 attribuée à l'interface principale. Au moment où je me connecte, l'adresse IPv4 a bien été attribuée et le réseau est opérationnel.

Je suppose que je pourrais modifier le point auquel le script s'exécute en jouant avec le WantedBy paramètre, mais je ne sais pas comment faire.

Quelqu'un pourrait-il m'orienter dans la bonne direction ?

Réponse acceptée :

Sur les dépendances de configuration réseau systemd

Il est très facile d'affecter l'ordre des unités de systemd. D'un autre côté, vous devez faire attention à ce qu'une unité terminée garantit.

Configurez votre service

Sur les systèmes actuels,
trier après network.target garantit simplement que le service réseau a été démarré, pas qu'il existe une configuration réelle. Vous devez commander après network-online.target et tirez-le pour y parvenir.

[Unit]
Wants=network-online.target
After=network-online.target

Pour la compatibilité avec les systèmes plus anciens, vous devrez peut-être également commander après network.target.

[Unit]
Wants=network-online.target
After=network.target network-online.target

C'est pour le fichier d'unité de votre service et pour systemd.

Mise en œuvre dans les versions actuelles du logiciel

Vous devez maintenant vous assurer que network-online.target fonctionne comme prévu (ou que vous pouvez au moins utiliser network.target ).

La version actuelle de NetworkManager propose le NetworkManager-wait-online.service qui est tiré par network-online.target et donc par votre service. Ce service spécial garantit que votre service attendra jusqu'à ce que toutes les connexions configurées pour être démarrées automatiquement réussissent, échouent ou expirent.

La version actuelle de systemd-networkd bloque votre service jusqu'à ce que tous les appareils soient configurés comme demandé. Il est plus simple car il ne prend actuellement en charge que les configurations appliquées au démarrage (plus précisément au démarrage de `systemd-networkd.service).

Par souci d'exhaustivité, le /etc/init.d/network service dans Fedora, tel qu'interprété par les versions actuelles de systemd, bloque network.target et bloque donc indirectement network-online.target et votre service. C'est un exemple d'implémentation basée sur un script.

Si votre implémentation, qu'elle soit basée sur un démon ou sur un script, se comporte comme l'un des services de gestion de réseau ci-dessus, elle retardera le démarrage de votre service jusqu'à ce que la configuration du réseau soit terminée avec succès, ait échoué pour une bonne raison ou ait expiré après un délai raisonnable. cadre à compléter.

Connexe :Rechercher des fichiers dont les noms de chemin contiennent plusieurs mots sans ordre spécifique entre eux ?

Vous voudrez peut-être vérifier si netctl fonctionne de la même manière et cette information serait un ajout précieux à cette réponse.

Implémentations dans les anciennes versions du logiciel

Je ne pense pas que vous verrez une version suffisamment ancienne de systemd où cela ne fonctionnerait pas bien. Mais vous pouvez vérifier qu'au moins network-online.target existe et qu'il est commandé après network.target .

Anciennement NetworkManager seulement garanti qu'au moins une connexion serait appliquée. Et même pour que cela fonctionne, vous devez activer le NetworkManager-wait-online.service explicitement. Cela a été corrigé depuis longtemps dans Fedora mais n'a été appliqué que récemment en amont.

systemctl enable NetworkManager-wait-online.service

Remarques sur les implémentations de network.target et network-online.target

Vous ne devriez jamais avoir besoin de faire dépendre votre logiciel de NetworkManager.service ou NetworkManager-wait-online.service ni aucun autre service spécifique. Au lieu de cela, tous les services de gestion de réseau doivent se commander avant network.target et éventuellement network-online.target .

Un simple service de gestion de réseau basé sur un script doit terminer la configuration du réseau avant de quitter et doit se commander avant network.target et donc indirectement avant network-online.target .

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Un service de gestion de réseau basé sur un démon doit également se commander avant network.target même si ce n'est pas très utile.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

Un service qui attend que le démon se termine doit s'ordonner après le service spécifique et avant network-online.target . Il doit utiliser Requisite sur le service démon afin qu'il échoue immédiatement si le service de gestion de réseau respectif n'est pas utilisé.

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Le paquet doit installer un lien symbolique vers le service en attente dans le wants répertoire pour network-online.target afin qu'il soit attiré par les services qui veulent attendre le réseau configuré.

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

Documentation associée

  • http://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target
  • http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

Remarques finales

J'espère que j'ai non seulement aidé à répondre à votre question au moment où vous l'avez posée, mais aussi contribué à améliorer la situation dans les distributions en amont et Linux, afin que je puisse maintenant donner une meilleure réponse que ce qui était possible au moment de la rédaction de l'original .


Linux
  1. Service du système d'exploitation Linux "scsi_reserve"

  2. Script Ruby en tant que service

  3. Vagrant exécute un script ou une commande après chaque redémarrage de l'invité (vagrant up)

  4. Exécuter le script bash après la connexion

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

Premiers pas avec systemctl

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment exécuter une commande dans un script shell ?

Centos 7 :Prise en main

Exécuter le script bash en tant que démon

Comment exécuter un script bash ?