Warum werden Post-Up-Befehle in / etc / network / interfaces beim Booten mehrmals ausgeführt?


10

Hier ist der Inhalt von /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

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

Und sshstartist ein Skript mit folgendem Inhalt:

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 username@17.16.15.2 -p 8080

Wenn der Computer neu gestartet wird, wird der curlBefehl mehrmals ausgeführt, die Datei landet zwei- oder dreimal auf dem FTP-Server, und wenn ich mir die Prozesse ansehe, scheint es, als würden mehrere Instanzen von Autossh ausgeführt ... Ich bin mir nicht sicher, ob dies der Fall ist autossh macht Dinge oder nicht, aber Curl sollte die Datei auf keinen Fall mehrmals hochladen.

Meine Vermutung ist, dass das gesamte sshstartSkript mehrmals ausgeführt wird, aber ich verstehe nicht warum.

Ich habe versucht, beim Booten nach Details zum Netzwerk-Setup-Prozess zu suchen, konnte jedoch nur Syntaxinformationen für die Schnittstellendatei finden.

Kann mir bitte jemand helfen?

Vielen Dank.

--- Bearbeiten ---

Wie unten vorgeschlagen, habe ich meine Schnittstellendatei wie folgt geändert (die leeren Zeilen über dem Post-Up entfernt):

auto lo
iface lo inet loopback

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

Und fügte die folgende Zeile zu sshstart hinzu:

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

Hier ist der Inhalt von /run/shm/sshstart.lognach einem Neustart:

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

Es wurde also 4 Mal ausgeführt :( Was ist los?


1
Hinweis: lo setzt if-up.d auf true und eth0 setzt es ebenfalls auf true. Das Post-Up läuft nach jedem Einstellen. Ihr Skript muss davon abhängen, dass nur eine Schnittstelle aktiv ist, nicht beide.
eyoung100

Ich dachte, es könnte so etwas sein, schätze, es ist Zeit für RTFM.
TCZ8

Ich habe mich umgesehen und kann nicht finden, wie ich angeben soll, welcher Adapter für den Post-Up-Befehl verwendet wird. Es scheint etwas mit einer "Zeilengruppe" zu tun zu haben, aber ich verstehe es nicht genau. Die Debian- und Ubuntu-Schnittstellenseite enthält eine Menge Informationen, aber sie haben diesen Teil übersprungen.
TCZ8

1
Nicht im Zusammenhang mit der Frage, aber BTW echo $(date)ist etwas umständlich und indirekt. Könnte auch so buchstabieren wie date. Ähnlich wie bei der nutzlosen Verwendung des Cat Award .
Celada

hahaha! du liegst absolut richtig! Ich habe keine Ahnung, warum ich das getan habe: P
TCZ8

Antworten:


13

Dateien werden /etc/network/if-up.d bereits automatisch ausgeführt, wenn eine Schnittstelle (eine beliebige Schnittstelle) aufgerufen wird. Wenn Sie dasselbe Skript angeben, das in einem expliziten post-upBefehl erneut ausgeführt werden soll, wird das Skript nur erneut ausgeführt. Ich vermute also, dass dies passieren sollte:

  • Es wird einmal ausgeführt, wenn es loangezeigt wird (mit Umgebungsvariable IFACE=lo), da es sich in befindet /etc/network/if-up.d.
  • Es wird aus demselben Grund einmal ausgeführt, wenn eth0es (mit Umgebungsvariablen IFACE=eth0) angezeigt wird.
  • Es wird erneut ausgeführt, wenn es eth0angezeigt wird (mit nicht festgelegter Umgebungsvariable IFACE), da Sie dies in einer post-upDirektive angefordert haben.

Ich bin mir nicht sicher, woher das vierte Mal kommt, aber das sind sowieso schon drei.

Sie müssen das Skript entweder an einer anderen Stelle suchen und einmal mit einer post-upDirektive ausführen oder es dort belassen, wo es sich befindet. Erwähnen Sie es jedoch nicht in einer post-upDirektive und überprüfen Sie den Wert von, $IFACEdamit es nichts tut, es sei denn, die gewünschte Schnittstelle ( eth0) ist gekommen oben.


OHH MAN! Schließlich! Sie haben absolut Recht, ich habe gerade eine Zeile zu sshstart hinzugefügt, um $ IFACE in meiner Protokolldatei wiederzugeben, und es ist genau so, wie Sie es beschrieben haben! Das erste Mal ist lo, das zweite Mal ist eth0, das dritte Mal ist eth0 (aus dem Post-up) und das vierte Mal ist nicht so klar. Der Wert von $ IFACE beim vierten Mal ist: --all Sie würden nicht zufällig wissen, was das ist meint? Nur aus Neugier :)
TCZ8

1
Ich wusste nichts davon --all. Es hört sich so an, als ob es eine Funktion gibt, mit der die if-up.dSkripte ein letztes Mal mit diesem Argument ausgeführt werden können, um zu signalisieren, dass alle Schnittstellen jetzt aktiv sind, falls ein Skript eine Aktion ausführen möchte, sobald bekannt wird, dass keine weiteren Schnittstellen anstehen. Das erklärt das vierte Mal.
Celada

Das macht Sinn, danke für all Ihre Hilfe!
TCZ8

3

Wie von Celada angegeben, werden /etc/network/if-up.dSkripte für jede Schnittstelle ausgeführt. Um Regelüberschneidungen zu vermeiden, fügen Sie einfach Folgendes hinzu:

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

oben in Ihrem Skript. Dadurch wird das Skript sofort beendet, wenn die Schnittstelle nicht die gewünschte ist.


1

Löschen Sie die leere Zeile vor dem post-upBefehl. Dies sollte den post-upBefehl eth0nur beziehen . Verschieben Sie Ihr Skript zusätzlich aus dem if-up.dOrdner. Skripte in diesem Ordner werden automatisch ausgeführt, unabhängig davon, ob sie als definiert sind post-up. In Ihrem Fall wird es zusätzlich zu Ihrem post-upBefehl ausgeführt.


Funktioniert nicht, siehe die Bearbeitung in meiner Frage.
TCZ8
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.