
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 net0
hay 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 .device
unidad 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 Wants
yAfter
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 .device
las unidades están loaded
haciendo 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