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

関連情報