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@net0net0網路介面在哪裡。如何在每次網路介面重啟時重新啟動服務?

答案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單位。loadedsystemctl 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

相關內容