如果网络接口故障,启动bash脚本重新加载网络



我有几个经常需要电源循环的板。大约10%的情况下,网络接口无法启动(ifconfig没有显示任何内容,r8169驱动程序无法加载,等等)。我正试图找出根本原因,但同时需要一个快速解决方案。我编写了一个快速的bash脚本,在启动时运行,通过ping本地接口来检测接口是否关闭,然后在必要时重新加载网络。

相关代码段:

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。据我所知,这是在内核级别过滤的,甚至不会到达网络堆栈。您确定这真的可以告诉您的网络接口是否已打开吗?

无论如何,要测试接口是UP还是DOWN,您可能依赖于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的输出。

最新更新