Systemd, reinicia el servicio cuando cambia la dirección IP

Systemd, reinicia el servicio cuando cambia la dirección IP

Escribí un servicio bastante simple:

[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

Lo cual empiezo como systemclt start myservice@net0, donde net0hay una interfaz de red. ¿Cómo puedo reiniciar el servicio cada vez que se reinicia la interfaz de red?

Respuesta1

Puede hacer que su unidad systemd se vincule ( BindTo) y dependa de ( DependsOn) la .deviceunidad para la interfaz de red correspondiente (que se carga automáticamente) para dicha interfaz de la siguiente manera:

[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

Probablemente querrás formalizar la dependencia de la unidad agregando WantsyAfter si su unidad personalizada espera tener la interfaz de reden realidad en líneaagregando estos en la [Unit]sección:

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

NB: Puedes verificar que .devicelas unidades están loadedhaciendo systemctl list-units --type=device.

Respuesta2

Probablemente esto podría funcionar: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

información relacionada