Systemd, Dienst neu starten, wenn sich die IP-Adresse geändert hat

Systemd, Dienst neu starten, wenn sich die IP-Adresse geändert hat

Ich habe einen ziemlich einfachen Dienst geschrieben:

[Unit]
Description=Service on interface %I

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/project/my_script.sh start %I

[Install]
WantedBy=multi-user.target

Was ich starte systemclt start myservice@net0, ist, wo net0sich eine Netzwerkschnittstelle befindet. Wie kann ich den Dienst jedes Mal neu starten, wenn die Netzwerkschnittstelle neu gestartet wird?

Antwort1

Sie können Ihre systemd-Unit so konfigurieren, dass sie die Unit für die entsprechende Netzwerkschnittstelle (die automatisch geladen wird) für die besagte Schnittstelle bindet ( BindTo) und von ihr abhängig ist ( ), und zwar wie folgt:DependsOn.device

[Unit]
Description=Service on interface %I
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/project/my_script.sh start %I

[Install]
WantedBy=multi-user.target

Sie möchten die Abhängigkeit der Einheit wahrscheinlich formalisieren, indem Sie hinzufügen, Wantsund Afterwenn Ihre benutzerdefinierte Einheit die Netzwerkschnittstelle erwartettatsächlich onlineindem Sie Folgendes im [Unit]Abschnitt hinzufügen:

Wants=network-online.target
After=network-online.target

NB: Sie können die .deviceEinheiten überprüfen loaded, indem Sie Folgendes tun systemctl list-units --type=device.

Antwort2

Wahrscheinlich könnte das funktionieren:https://clinta.github.io/run-service-on-ip-change/

# /etc/systemd/system/ip-change-mon.service

[Unit]
Description=IP Change Monitor
Wants=network.target
After=network-online.target

[Service]
ExecStart=:/bin/bash -c "ip mon addr | sed -nu -r
\'s/.*[[:digit:]]+:[[:space:]]+([^[:space:]]+).*/\\1/p\' | while read iface; do
systemctl restart ip-changed@${iface}.target; done"

[Install]
WantedBy=multi-user.target default.target

verwandte Informationen