刷新ping计时器

时间:2018-06-25 11:21:47

标签: python

我正在编写一个脚本,该脚本将在我的网络掉线或其中一台服务器掉线时提醒我。下面是代码:

import subprocess
import time
iplist=["127.0.0.1","8.8.8.8"]
#iplist=["127.0.0.1","8.8.8.8", "983.42.23.342"]

def Pingisdown(ip, p):
    timeouts = time.time()
    p.wait()
    while p.poll(): 
        timeout = time.time()
        print(ip)
        print(timeout - timeouts)
        #length
        if p.poll() == 0:
            break   
            print("YAYYY")

for ip in iplist:
    p = subprocess.Popen('ping '+ip,stdout=subprocess.PIPE)
    p.wait()
    if p.poll(): 
        Pingisdown(ip, p)
    else:
        print (ip+" is up")

问题是备份网络后启用网络时,仍将其视为脱机状态。 p.poll如果脱机则报告为1,如果脱机则为0,如果在线时报告为0,则在while循环中,无论哪种方式,一旦我将其重新打开,它都会记录为1。

编辑:

我已经使用提供的代码中的一个很好的部分对其进行了重做。它不是因为使用if条件而使用一会儿时间,而是由于ping所有准备重复的结果。现在正在工作

import subprocess
import time
iplist=["127.0.0.1","8.8.8.8"]
#iplist=["127.0.0.1","8.8.8.8", "983.42.23.342"]

def Pingisdown2(ip, p, timeouts):
    p = subprocess.Popen('ping '+ip,stdout=subprocess.PIPE) 
    p.wait()
    if p.poll(): 
        Pingisdown(ip, p, timeouts) 
    else:
        print (ip+" is up") 
        timeout = time.time()
        print(timeout - timeouts)

def Pingisdown(ip, p, timeouts):
    print(ip)
    Pingisdown2(ip, p, timeouts)

for ip in iplist:
    p = subprocess.Popen('ping '+ip,stdout=subprocess.PIPE) 
    p.wait()
    if p.poll(): 
        timeouts = time.time()
        Pingisdown(ip, p, timeouts) 
        timeout = time.time()
    else:
        print (ip+" is up")

2 个答案:

答案 0 :(得分:1)

您不会在每次调用pingwait()时再次运行poll() -您只是从第一次运行中得到结果。这样,如果失败,则每次调用poll()时结果都将保留为失败。

答案 1 :(得分:0)

由于您对ping命令调用的状态码感兴趣,因此使用subprocess.check_call会更合适。另外,传递args作为列表而不是字符串,这是从python调用bash命令的首选方式,请参见下面while循环的正文:

try:
    # I've added -i and -c flags for fast ping command. Run `man ping` in terminal for flags description.
    subprocess.check_call(['ping', '-c', '5', '-i', ' 0.2', ip]) 
except subprocess.CalledProcessError:
    Pingisdown(ip) # NOTE: Update to process only ip.
else:
    print (ip+ " is up")

请让我知道在应用建议的处理方法后错误是否还会消失。