Das Festlegen einer statischen Route bei jedem Start mit launchd / plist schlägt fehl

Ich hoffe, launchd verwenden zu können, um beim Booten eine statische Route auf einem Server festzulegen, da ich keinen besseren Weg gefunden habe, um diese Art von Netzwerk auf einem Server zu konfigurieren.

Mein Problem ist, dass der Befehl ausgeführt zu werden scheint, bevor der Netzwerkstapel eingerichtet ist. Daher suche ich nach Ratschlägen, wie ich meine plist so ändern kann, dass sie irgendwie vom Systemrouting abhängt, das eingerichtet wird, bevor es ausgeführt wird.

16. Januar 14:39:45 Server com.company.route.legacy_printer [149]: Route: Schreiben an Routing-Socket: Netzwerk ist nicht erreichbar

16. Januar 14:39:45 Server com.company.route.legacy_printer [149]: Netz 10.1.1.1 hinzufügen: Gateway 10.0.1.2: Netzwerk ist nicht erreichbar

Ich erhalte diesen Fehler nach einem Neustart, aber das Laden der gleichen plist wie root, sobald der Mac hochgefahren ist, funktioniert einwandfrei, also hoffe ich, dass es eine einfache Optimierung ist oder jemand mir einen besseren Weg weist, um nach jedem Start zuverlässig eine statische Route zu erhalten.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.company.route.legacy_printer</string>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/route</string>
        <string>-n</string>
        <string>add</string>
        <string>-net</string>
        <string>10.1.1.1</string>
        <string>10.0.1.2</string>
        <string>255.255.255.0</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
</dict>
</plist>

Ich habe sowohl Ausführen eines Befehls, wenn der Mac mit launchctl/plist hochfährt als auch Wie kann ich eine Anwendung beim Booten/Anmelden/zu einem anderen Zeitpunkt automatisch ausführen/stoppen/neu starten? um so weit zu kommen, aber Sie brauchen einen zusätzlichen Schubs, um die richtige Abhängigkeit zu finden, um das richtige Timing für den Routenbefehl zu erhalten.

Wenn Sie es sich leisten können, besteht die einfachste Lösung möglicherweise darin, einfach ein paar Sekunden Verzögerung hinzuzufügen.
Ich bin versucht, 60 Sekunden Schlaf und eine Pipe einzulegen, da launchd Jobs nicht unbedingt in derselben Reihenfolge plant. Es sollte kein großes Problem sein, Dinge zu verzögern, nur weniger sauber, als zu wissen, wie man tatsächlich den richtigen Trigger einbaut.

Antworten (1)

Ein kurzer Aufruf von scutil sollte beim Testen helfen, ob das Netzwerk für eine bestimmte Schnittstelle auf IPv4 bereit ist, was ausreichen sollte, um festzustellen, wann Sie eine IPv4-Route hinzufügen können. Der folgende Befehl gibt eine 0 zurück, wenn die erste Ethernet-Verbindung innerhalb des standardmäßigen Zeitlimits von 15 Sekunden eine funktionsfähige IPv4-Adresse hat.

  • /usr/sbin/scutil -w State:/Network/Interface/en0/IPv4

Sie könnten stattdessen ein Skript aufrufen, um das Testen und Routing durchzuführen – vielleicht mit dem Befehl -t, um das Timeout bei Bedarf anzupassen. Ich kenne keine Möglichkeit, die launchd-Argumente zu überladen, damit alles enthalten ist, aber es sollte in Ordnung sein, launchd ein Skript auf dem lokalen Dateisystem starten zu lassen, um diese Aufgabe zu erledigen. Seien Sie vorsichtig, wenn Sie en0 nicht für Ihr IPv4 verwenden oder Routing auf einer anderen als der Standard-Netzwerkschnittstelle haben möchten.

Dieses Skript kann dann nach Fehlern suchen, vielleicht nach anderen Schnittstellen suchen sowie Erfolg und Fehler mit dem loggerBefehl protokollieren.

Dieser Anruf funktioniert nicht in einem rein drahtlosen Szenario, da diese Geräte im Allgemeinen en1 sind. Nur mehr Betonung auf „[…] Testen, ob das Netzwerk für eine bestimmte Schnittstelle auf IPv4 bereit ist“.
Wenn ich mit mehreren Schritten für launchd-Plists konfrontiert werde, finde ich normalerweise, dass das Schreiben eines Skripts und die Verwendung der Plist zum Aufrufen des Skripts am besten funktioniert.
Guter Punkt @fragen - verbundene Schnittstellen und Thunderbolt-Adapter können en0 nicht zum bevorzugten Netzwerknamen machen.