我有几块电路板经常需要重启电源。大约百分之十的时间,网络接口无法启动(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脚本的新手,并且不知道从哪里开始。
编辑:实际上看来,当电路板发生故障时,脚本根本不会执行。感谢您的解决方案,但问题出在其他地方。我将结束这个问题。
答案 0 :(得分:1)
您可能因某种原因猜测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
的输出。