Systemd, перезапустить службу при изменении IP-адреса

Systemd, перезапустить службу при изменении IP-адреса

Я написал довольно простой сервис:

[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

Который я начинаю как systemclt start myservice@net0, где net0сетевой интерфейс. Как мне перезапустить службу каждый раз, когда сетевой интерфейс перезапускается?

решение1

Вы можете связать свой модуль systemd ( BindTo) и заставить его зависеть ( 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

Вероятно, вам захочется формализовать зависимость модуля, добавив Wantsи After, если ваш пользовательский модуль ожидает иметь сетевой интерфейс,на самом деле онлайндобавив их в [Unit]раздел:

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

Примечание: Вы можете проверить, что .deviceединицы loadedизмерения соответствуют systemctl list-units --type=device.

решение2

Вероятно, это могло бы сработать: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

Связанный контент