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 秒,但您可以轻松更改该行为以适应您的情况
我正在使用 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 秒,但您可以轻松更改该行为以适应您的情况