【问题标题】:Startup bash script to reload network if network interfaces are down如果网络接口关闭,启动 bash 脚本以重新加载网络
【发布时间】:2014-08-31 00:12:23
【问题描述】:

我有几块板子经常需要重启。大约百分之十的时间,网络接口无法启动(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 二进制文件的完整路径。 (即/bin/ping -c 1 127.0.0.1
  • 我不同意这种说法,即如果“IF”语句失败,它什么也不做,那么它肯定会回显 $ERR Network down,在同一个日志文件中盯着一行...看起来,ping 命令从未向 IF 语句返回任何结果,因此日志中除了“fixnet running”之外没有任何输出

标签: bash shell networking openwrt


【解决方案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

【讨论】:

  • 非常有用的脚本!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多