在运行“ip link”、“ip addr”和“ip Route”命令之前如何等待 eth0 接口?

在运行“ip link”、“ip addr”和“ip Route”命令之前如何等待 eth0 接口?

我需要在启动时在 Synology NAS 上运行以下脚本。 Synology NAS 具有内置的计划任务,能够在启动时触发任务。

我需要运行的脚本是这样的:

#!/bin/sh

ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0

但是,这不起作用,当eth0接口尚未准备好接受这些命令时,任务似乎很快就会触发。

sleep 60在所有命令之前放置ip *可以解决问题。但在做我的事情之前等待任意几秒钟感觉不太合适。

鉴于我的上述要求,等待eth0接口可用以便我可以执行ip *命令的最佳方法是什么?

答案1

eth0检查from的状态/sys/class/net/eth0/operstate并等待网络接口 up:

while ! [ "$(cat /sys/class/net/eth0/operstate)" = "up" ] 
do
    echo  "waiting for eth0 to be up"
    sleep 2
done

ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0

答案2

这是我最终解决问题的解决方案:

while ! ip link show eth0 | grep -q 'state UP'; do
    sleep 1
done

ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0

但是,我的 Synology 上有 2 个“启动”计划任务,并且在启动时遇到一些错误。为了解决这个问题,我将此任务配置为将另一个任务作为前置任务。换句话说,任务按顺序执行,等待前一个任务完成后再开始新的任务。

相关内容