我写了一个非常简单的服务:
[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