Systemd, reinicie o serviço quando o endereço IP for alterado

Systemd, reinicie o serviço quando o endereço IP for alterado

Eu escrevi um serviço bem simples:

[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

Que começo assim systemclt start myservice@net0, onde net0está uma interface de rede. Como posso reiniciar o serviço sempre que a interface de rede for reiniciada?

Responder1

Você pode vincular sua unidade systemd ( BindTo) e depender ( DependsOn) da .deviceunidade para a interface de rede correspondente (que é carregada automaticamente) para a referida interface da seguinte forma:

[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

Você provavelmente desejará formalizar a dependência da unidade adicionando Wantse Afterse sua unidade personalizada espera ter a interface de redena verdade on-lineadicionando-os na [Unit]seção:

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

NB: Você pode verificar se as .deviceunidades estão loadedfazendo systemctl list-units --type=device.

Responder2

Provavelmente isso poderia 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

informação relacionada