【问题标题】:Ubuntu: wait for network link up and execute a bash commandUbuntu:等待网络连接并执行 bash 命令
【发布时间】:2014-07-03 07:55:39
【问题描述】:

在 Ubuntu(最新发行版很好)中,我想重新启动路由器并在 bash 脚本中使用一个命令来等待网络链接再次启动,当它检测到它时,它必须启动一个 bash 命令。

我可以通过某种轮询循环来实现这一点,但理想的解决方案是有一个 bash 命令,在执行时等待链接启动并自动执行我给它的 bash 命令。

我读过一些关于 dbus 的东西(dbus 似乎是要走的路),但似乎要花太多时间才能完全理解如何正确使用它。有人建议我检查像 ethtool 这样的工具是否能够执行这种“等待并执行”,但在手册页中我没有找到任何相关信息。

注意:我忘了说我想要检查链路的物理层是否启动的命令。因此不接受在上层工作的解决方案。此外,涉及将脚本放入目录(例如 /etc/network/if-up.d)的解决方案也不被接受。


有什么想法吗?

谢谢

【问题讨论】:

    标签: linux bash shell ubuntu networking


    【解决方案1】:

    我建议的事件监听器:

    inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'
    

    当您插入或拔出网线时,它会触发回显“检测到更改”,当然它几乎可以触发任何事情。

    这将一次性运行,但我告诉你如何用它制作一个守护进程,如果不是,这将是一个很好的学习练习:)

    【讨论】:

    • 我唯一需要测试的(现在我不能)是 /sys/class/net/eth0/carrier 中的值是否会发生变化,即使电缆已插入但路由器已重启
    • 主机是否直接插入路由器?
    • 是的。我已经在 bash 中实现了一些测试,其中一个测试要求当路由器重新启动时,我的 bash 脚本会执行一个命令。
    • 我尝试使用 inotify 但似乎无法检测到 /sys/class/net/eth0/carrier 何时被修改。我读到 inotify 无法检测到 sysfs 中所有文件的更改。这可能是其中一种情况。只是一个问题:您是否在计算机上尝试过您的解决方案?
    • @condorwasabi, 链接打开时更改(打开或访问)的文件之一是/etc/network/if-up.d/avahi-daemon 文件,您可以在其上使用inotifywait,然后您可以检查/sys/class/net/eth0/carrier 文件为它的值( 0 或 1 )。
    【解决方案2】:

    如果您想要一个命令来检查链接是打开还是关闭,请使用ip

    ip addr show eth0 | grep -Po "(?<=state ).*?(?=\s)"
    DOWN
    
    ip addr show wlan0 | grep -Po "(?<=state ).*?(?=\s)"
    UP
    

    【讨论】:

      【解决方案3】:

      您可以通过 /sys/class/net/eth0/carrier 文件检查链接是否打开/关闭

      cat /sys/class/net/eth0/carrier
      

      如果输出为 1,则以太网电缆已插入并且链接已启动。

      如果输出为 0,则以太网电缆被移除并且链接断开。

      注意:如果你有 eth0 以外的接口,则用 eth2/eth3 等接口替换 eth0

      【讨论】:

      • 您的解决方案和@Tiago 的解决方案都很好,但它们属于“轮询类型”。如果我们能找到一个不需要我进行显式轮询的命令,那将是理想的解决方案
      • @condorwasabi 你可以使用inotify作为事件监听器,以防/sys/class/net/eth0/carrier发生变化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2019-05-04
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多