我需要在启动时在 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 个“启动”计划任务,并且在启动时遇到一些错误。为了解决这个问题,我将此任务配置为将另一个任务作为前置任务。换句话说,任务按顺序执行,等待前一个任务完成后再开始新的任务。