AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 42021
Accepted
Sander Versluys
Sander Versluys
Asked: 2009-07-17 23:45:42 +0800 CST2009-07-17 23:45:42 +0800 CST 2009-07-17 23:45:42 +0800 CST

如何在 linux 中 ping 直到主机已知?

  • 772

如何 ping 某个地址,找到后停止 ping。

我想在 bash 脚本中使用它,所以当主机启动时,脚本会继续 ping,并且从主机可用的那一刻起,脚本会继续......

linux bash command-line-interface ping
  • 18 18 个回答
  • 88157 Views

18 个回答

  • Voted
  1. Best Answer
    Gordon Davisson
    2009-07-18T15:16:23+08:002009-07-18T15:16:23+08:00

    Martynas 回答的进一步简化:

    until ping -c1 www.google.com >/dev/null 2>&1; do :; done
    

    注意 ping 本身被用作循环测试;一旦成功,循环结束。循环体为空,空命令“ :”用于防止语法错误。

    更新:我想到了一种让 Control-C 干净地退出 ping 循环的方法。这将在后台运行循环,捕获中断(Control-C)信号,并在发生时终止后台循环:

    ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
    until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
    trap "kill $!; ping_cancelled=true" SIGINT
    wait $!          # Wait for the loop to exit, one way or another
    trap - SIGINT    # Remove the trap, now we're done with it
    echo "Done pinging, cancelled=$ping_cancelled"
    

    这有点迂回,但如果你希望循环可以取消,它应该可以解决问题。

    • 97
  2. Aaron Copley
    2013-10-12T06:37:23+08:002013-10-12T06:37:23+08:00

    我知道这个问题很老......并且特别询问关于ping,但我想分享我的解决方案。

    我在重新启动主机时使用它来了解何时可以再次通过 SSH 连接到它们。(因为ping会在开始前响应几秒钟sshd。)

    until nc -vzw 2 $host 22; do sleep 2; done
    
    • 36
  3. Martynas Saint
    2009-07-18T00:01:03+08:002009-07-18T00:01:03+08:00

    您可以执行一个循环,发送一个 ping 并根据状态中断循环,例如(bash):

    while true; do ping -c1 www.google.com > /dev/null && break; done
    

    将它放在脚本中的某个位置会阻塞,直到www.google.com可以 ping 通为止。

    • 29
  4. Jan Jungnickel
    2009-07-17T23:58:50+08:002009-07-17T23:58:50+08:00

    ping 目标主机一次。检查 ping 是否成功(ping 的返回值为零)。如果主机不存在,请再次 ping。

    以下代码可以保存为文件并使用主机名作为参数调用,或者剥离第一行和最后一行并用作现有脚本中的函数(waitForHost 主机名)。

    如果 ping 没有导致响应,则代码不会评估失败的原因,因此如果主机不存在,则永远循环。我的 BSD 手册页列出了每个返回值的含义,而 linux 没有,所以我想这可能不是可移植的,这就是我忽略它的原因。

    #!/bin/bash
    
    PING=`which ping`
    
    function waitForHost
    {
        if [ -n "$1" ]; 
        then
            waitForHost1 $1;
        else
            echo "waitForHost: Hostname argument expected"
        fi
    }
    
    function waitForHost1
    {
        reachable=0;
        while [ $reachable -eq 0 ];
        do
        $PING -q -c 1 $1
        if [ "$?" -eq 0 ];
        then
            reachable=1
        fi
        done
        sleep 5
    }
    waitForHost $1
    
    • 11
  5. radius
    2009-07-18T00:09:50+08:002009-07-18T00:09:50+08:00
    UNREACHEABLE=1;
    while [ $UNREACHEABLE -ne "0" ]; 
       do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
    done
    

    您可以删除 sleep 1,它只是为了防止任何洪水问题,以防主机可以访问但 ping 不会以代码 0 退出。

    • 9
  6. Francois Wolmarans
    2009-07-18T00:00:56+08:002009-07-18T00:00:56+08:00

    请在stackoverflow上查看好的选项。这是 bash 中的示例,您必须循环以下代码,直到它返回成功的 ping 结果。

    
    ping -c 1 -t 1 192.168.1.1;
    if [ $? -eq 0 ]; then
        echo "192.168.1.1 is up";
    else 
        echo "ip is down";
    fi
    
    
    • 4
  7. cas
    2009-07-19T15:25:40+08:002009-07-19T15:25:40+08:00

    上述任何循环也可以与 fping 一起使用,而不是 ping,IMO 比 ping 本身更适合在脚本中使用。有关详细信息,请参阅fping(1)。

    while ! fping -q $HOSTNAMES ; do :; done
    

    在对机器进行操作之前测试机器是否已启动也很有用。一个简单的例子:

    对于 HOST1 HOST2 HOST3 中的 h ;做
      如果 fping -q $h ; 然后
         回声-n“$h:”
         ssh $h "uname -a"
      菲
    完毕
    
    • 3
  8. Melebius
    2019-11-21T23:46:01+08:002019-11-21T23:46:01+08:00

    对于 macOS 用户,ping有-o专门用于此的选项:

    -o      Exit successfully after receiving one reply packet.
    

    所以命令很简单:

    ping -o www.google.com
    

    当主机被成功 ping 一次时返回 0。

    • 3
  9. johntellsall
    2016-08-09T14:37:48+08:002016-08-09T14:37:48+08:00

    一般来说,我想等待我的数据库或其他服务器启动,但我不想等待太久。以下代码等待 10 秒,然后如果服务器未在时间限制内出现,则设置退出代码。

    如果服务器在时间限制之前出现,则循环将被短路,以便下一段代码可以运行。

    for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${HOST} &>/dev/null && break ; done
    
    • 1
  10. saulius2
    2021-06-30T13:10:29+08:002021-06-30T13:10:29+08:00

    伙计们,是的,这是旧的。这里有很多很好的答案。

    但我刚刚发现了我所谓的美女!如果有人喜欢原生ping计数器:

    ping $HOST | sed "/ ms$/ q"

    这不是很迷人吗?:)

    [p@localhost ~]$ VBoxManage startvm VGTU-2021-LDVM1 --type headless && \
    > ping 192.168.10.14 | sed "/ ms$/ q"
    Waiting for VM "VGTU-2021-LDVM1" to power on...
    VM "VGTU-2021-LDVM1" has been successfully started.
    PING 192.168.10.14 (192.168.10.14) 56(84) bytes of data.
    From 192.168.10.8 icmp_seq=1 Destination Host Unreachable
    From 192.168.10.8 icmp_seq=2 Destination Host Unreachable
      ...
    From 192.168.10.8 icmp_seq=35 Destination Host Unreachable
    From 192.168.10.8 icmp_seq=36 Destination Host Unreachable
    64 bytes from 192.168.10.14: icmp_seq=37 ttl=64 time=2003 ms
    
    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve