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

次のように、システムデバイスをそのインターフェイスのデバイスの対応するネットワークインターフェイス(自動ロード)にバインド(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

注:を実行して単位を確認できます.deviceloadedsystemctl 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

関連情報