启动bash脚本以在网络接口关闭时重新加载网络
我有几个板,经常需要电源循环。大约有10%的情况下,网络接口无法启动(ifconfig没有显示任何内容,r8169驱动程序无法加载,等等)。我正试图找出根本原因,但同时需要一个快速修复。我编写了一个快速bash脚本,在启动时运行,通过ping本地接口来检测接口是否关闭,然后在必要时重新加载网络 相关代码部分:启动bash脚本以在网络接口关闭时重新加载网络,bash,shell,networking,openwrt,Bash,Shell,Networking,Openwrt,我有几个板,经常需要电源循环。大约有10%的情况下,网络接口无法启动(ifconfig没有显示任何内容,r8169驱动程序无法加载,等等)。我正试图找出根本原因,但同时需要一个快速修复。我编写了一个快速bash脚本,在启动时运行,通过ping本地接口来检测接口是否关闭,然后在必要时重新加载网络 相关代码部分: echo 'fixnet running' > $NV_LOG if ping -c 1 127.0.0.1; then echo "Network ok." >&g
echo 'fixnet running' > $NV_LOG
if ping -c 1 127.0.0.1; then
echo "Network ok." >> $NV_LOG
else
echo "$ERR Network down, starting up" >> $NV_LOG
/etc/init.d/network restart
fi
如果我手动运行这个脚本(./testNet.sh),它将按预期工作。但是,如果脚本在启动时运行,则在ping测试命令期间它似乎会失败(“fixnet running”输出到$NV_LOG,但没有其他输出)。这发生在网络接口关闭时-如果网络启动良好,此启动脚本也可以正常工作。我对bash脚本还不熟悉,不知道从这里开始该怎么做
编辑:实际上,当线路板出现故障时,脚本根本不会执行。谢谢你的解决方案,但问题出在其他地方。我将结束这个问题。您可以猜到
ping
命令由于某种原因被卡住了。也许在路线决议?
顺便说一句,您将ping 127.0.0.1,这是localhost。据我所知,这是在内核级别过滤的,甚至不能到达网络堆栈。你确定这真的能告诉你的网络接口是否正常吗
无论如何,要测试一个接口是向上还是向下,您可以使用ip
命令。它不通过网络发送打包,而只是检查接口状态:
在这里,要检查我的eth0接口是向上还是向下:
if ip addr show eth0 | grep 'state UP'; then
echo "Network ok."
else
echo "$ERR Network down, starting up"
/etc/init.d/network restart
fi 2>&1 >> $NV_LOG
请注意,我将整个if语句重定向到日志文件。这允许捕获
ip
命令的输出、消息和输出,或/etc/init.d/network restart
提供二进制文件的完整路径。(即,/bin/ping-c 1 127.0.0.1
)我不同意该语句,即,如果“if”语句失败,它不会做任何事情,那么它肯定会关闭echo$ERR网络,启动同一日志文件中的行。。。看起来,ping命令从未向IF语句返回任何结果,因此,除了“fixnet running”非常有用的脚本之外,日志中没有任何输出!