Pourquoi les commandes de post-up dans / etc / network / interfaces sont-elles exécutées plusieurs fois au démarrage?

10

Voici le contenu de /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

Et sshstartest un script avec les éléments suivants:

curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 [email protected] -p 8080

Lorsque la machine redémarre, la curlcommande est exécutée plusieurs fois, le fichier se termine 2 ou 3 fois sur le serveur ftp et quand je regarde les processus, il semble qu'il y ait plusieurs instances d'exécution automatique ... Je ne sais pas si c'est comme ça autossh fait des choses ou non, mais à coup sûr curl ne devrait pas télécharger le fichier plusieurs fois.

Mon intuition est que le sshstartscript entier est exécuté plusieurs fois mais je ne comprends pas pourquoi.

J'ai essayé de rechercher des détails sur le processus de configuration du réseau au démarrage mais tout ce que j'ai pu trouver était des informations de syntaxe pour le fichier d'interfaces.

Quelqu'un peut-il aider s'il vous plaît?

Je vous remercie.

--- Modifier ---

Comme suggéré ci-dessous, j'ai modifié mon fichier d'interfaces comme suit (supprimé les lignes vides ci-dessus post-up):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

Et ajouté la ligne suivante à sshstart:

echo $(date)>>/run/shm/sshstart.log

Voici le contenu /run/shm/sshstart.logaprès un redémarrage:

Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014

Donc ça a été couru 4 fois :( que se passe-t-il?

TCZ8
la source
1
Astuce: lo définit if-up.d sur true, et eth0 le définit également sur true. Le post-up s'exécute après que chacun est défini. Votre script doit dépendre d'une seule interface, pas des deux.
eyoung100
Je pensais que ça pourrait être quelque chose comme ça, devinez son temps pour RTFM un peu plus.
TCZ8
J'ai vérifié et je n'arrive pas à trouver comment spécifier quel adaptateur pour la commande de post-up, semble avoir quelque chose à voir avec une "strophe" mais je ne comprends pas exactement. la page des interfaces Debian et Ubuntu contient beaucoup d'informations mais elles ont ignoré cette partie.
TCZ8
1
Pas lié à la question, mais BTW echo $(date)est un peu maladroit et indirect. Autant épeler ça que date. Similaire à Useless Use of Cat Award .
Celada
hahaha! tu as tout à fait raison! Je ne sais pas pourquoi j'ai fait ça: P
TCZ8

Réponses:

13

Les fichiers sont /etc/network/if-up.d déjà exécutés automatiquement chaque fois qu'une interface (n'importe quelle interface) apparaît. Lorsque vous spécifiez le même script à réexécuter dans une post-upcommande explicite , vous ne faites que réexécuter le script. Donc, je suppose que c'est ce qui devrait arriver:

  • Il s'exécute une fois lorsqu'il loapparaît (avec une variable d'environnement IFACE=lo) car il se trouve dans /etc/network/if-up.d.
  • Il s'exécute une fois lorsqu'il eth0apparaît (avec la variable d'environnement IFACE=eth0) pour la même raison.
  • Il s'exécute à nouveau quand eth0apparaît (avec la variable d'environnement IFACEnon définie) parce que vous l'avez demandé dans une post-updirective.

Je ne sais pas d'où vient la quatrième fois, mais de toute façon, c'est déjà trois.

Vous devez soit localiser le script ailleurs et l'exécuter une fois à l'aide d'une post-updirective, soit le laisser là où il se trouve, mais ne le mentionnez pas dans une post-updirective et vérifier la valeur de $IFACEafin qu'il ne fasse rien à moins que l'interface souhaitée ( eth0) ne soit venue vers le haut.

Celada
la source
OHH MAN! Finalement! vous avez absolument raison, je viens d'ajouter une ligne à sshstart pour faire écho à $ IFACE dans mon fichier journal et c'est exactement comme vous l'avez décrit! La 1ère fois est lo, la 2ème fois est eth0, la 3ème est eth0 à nouveau (forme le post-up) et la 4ème fois n'est pas si claire .. La valeur de $ IFACE à la 4ème fois est: --all Vous n'arriveriez pas à savoir ce que veux dire? Juste par curiosité :)
TCZ8
1
Je n'en savais rien --all. Il semble qu'il existe une fonctionnalité pour exécuter les if-up.dscripts une dernière fois avec cet argument pour signaler que toutes les interfaces sont maintenant en place, au cas où certains scripts voudraient prendre une action une fois qu'il est connu qu'aucune autre interface n'est en attente. Cela explique la quatrième fois.
Celada
Cela a du sens, merci pour toute votre aide!
TCZ8
3

Comme indiqué par Celada, les /etc/network/if-up.dscripts sont exécutés pour chaque interface. Pour éviter la duplication des règles, ajoutez simplement:

[ "$IFACE" = "eth0" ] || exit 0

en haut de votre script. Cela entraînera la fermeture immédiate du script si l'interface n'est pas celle souhaitée.

ppparadox
la source
1

Supprimez la ligne vide avant la post-upcommande. Cela ne doit concerner que la post-upcommande eth0. Déplacez également votre script hors du if-up.ddossier. Les scripts de ce dossier sont exécutés automatiquement, peu importe s'ils sont définis comme post-up. Dans votre cas, il s'exécutera en plus de votre post-upcommande.

xx4h
la source
Ne fonctionne pas, voir la modification dans ma question.
TCZ8