
私は非常にシンプルなサービスを書きました:
[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