Python 保持 ping 主机直到可以访问。第一次无法在控制台上打印

Python keep pinging host until reachable. First time not reachable print on console

我正在使用 python 的 os.system 来 ping 一个网站。

from os import system
system('ping www.whosebug.com')

这给出了以下结果:

64 bytes from 151.101.1.69: icmp_seq=0 ttl=117 time=102.540 ms
64 bytes from 151.101.1.69: icmp_seq=1 ttl=117 time=101.990 ms
64 bytes from 151.101.1.69: icmp_seq=2 ttl=117 time=101.690 ms
64 bytes from 151.101.1.69: icmp_seq=3 ttl=117 time=106.207 ms
64 bytes from 151.101.1.69: icmp_seq=4 ttl=117 time=118.015 ms
...

但是,我想在到达网站后停止 bing,如果未到达则继续 ping。

system('ping -c 1 www.whosebug.com')

这将只 ping 一次,这不是我想要的。我怎样才能达到我想要的?

我还想在第一次无法访问该网站时在控制台上打印一条消息。这是如何实现的?

我会使用 subprocess 模块,因为你有更多的控制权。

一个函数的示例实现,该函数仅在站点正常运行时 return,而在站点关闭时将继续 ping:


import subprocess
import time

def ping_until_up(site="www.whosebug.com"):
    while True:
        status = subprocess.run(["ping", "-c", "3", site], capture_output=True)
        if status.returncode == 0:
            return
        print("Site is down...")
        time.sleep(30)


# -- Test --
import sys
ping_until_up(sys.argv[1])

这给你:

$ python3 ./test.py www.google.com
$ python3 ./test.py asd.asd.asd
Site is down...
Site is down...
Site is down...
...

注意事项:

  • 我进行了 3 次 ping,因为 1 次可能会导致漏报
  • 您可能应该处理不同类型的错误。在上面的例子中实际上是一个DNS错误。您可以使用捕获的输出执行此操作
  • 此函数在 轮失败的尝试和打印之间休眠 30 秒,但您可以轻松更改该行为以适应您的情况