“互联网连接检查单行”

“互联网连接检查单行”

这样我可以检查是否存在“互联网连接”。如果没有“互联网连接”(成功 ping 到这 2 个地方),那么它会等待 600 秒,然后继续运行:

ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600

但是:我怎样才能重写这一行,以便它循环直到有互联网连接?

答案1

while ! ping -W 1 -c 4 www.google.com >& /dev/null ||
      ! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do
  sleep 600
done

虽然我只是测试与 IP 地址的连接; 8.8.8.8是Google的公共DNS服务器(它具有非常高的可用性)。测试 DNS 是否工作无论如何都是不可靠的,因为该条目可能位于缓存中。

while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done

Ping 并不总是检查互联网连接的最佳方法。许多地方(尤其是企业网络)会阻止除 Web 访问之外的所有访问。您可以通过从高可用性服务器下载文件来测试网络是否正常工作。这也会测试 DNS,至少从 HTTP 代理的角度来看(这通常也是重要的)。

while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done

答案2

上述某些方法存在一些缺陷,以及为什么不能真正用一句话来完成全面的“互联网是否正常工作”:

  • 在尝试 ping 任何内容之前,您应该始终检查链接是否处于活动状态。如果你的以太网端口没有插入电缆或者你的蠢猫咬断了电线,那么什么都不会起作用。

  • 应该首先测试本地主机。这将验证 TCP/IP 堆栈的完整性。

  • 如果您的 DNS 服务器无法访问或被阻止,则通过指定域名来依赖 DNS 解析可能会失败。仅仅因为您的首选 DNS 服务器已关闭并不意味着您无法通过 Internet 连接到其他主机

  • 在不属于您的服务器上始终使用相同的地址或主机来检查连接情况并不好。您应该测试各种/随机的已知始终可用的主机集,最好是您拥有的位于网络之外的主机。

  • 我什至会说,您应该使用各种协议来真正查看“互联网”是否正常。也许您网络上的僵尸计算机作为 DDoS 的一部分发送了大量 ping,并且您的 ISP 阻止了 ICMP。

如果您确实必须采用单行方法,我会做的是跟踪路由到 google.com 或您选择的其他知名互联网站点。就一次。了解您的流量需要经过多少跳才能离开服务提供商的网络。随后,您可以使用跟踪路由来测试外部连接,但将其限制为那么多跳。如果跟踪路由中的最终 ping 成功,则您可以退出网络。希望有一个适用于其他协议(例如 HTTP 等)的“类似路由跟踪”的实用程序。

答案3

您可以只使用 shell 中的 while 循环。

while true; do
    if ping -W 1 -c 4 www.google.com >& /dev/null &&
       ping -W 1 -c 4 www.yahoo.com >& /dev/null; then
        break
    fi
    sleep 600
done

/bin/trueand命令test 0将始终返回 0(真),但true可能并不总是内置命令。

答案4

为了使逻辑更清晰一些,您可以在子shell中编写检查,例如

while ! ( ping -W 1 -c 4 www.google.com >& /dev/null &&
          ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do
    sleep 600
done

或者在函数中编写测试。

can_ping_internet() {
    ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com
}

while ! can_ping_internet; do
    sleep 600
done

相关内容