我正在编写一个脚本,该脚本将在我的网络掉线或其中一台服务器掉线时提醒我。下面是代码:
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")
答案 0 :(得分:1)
您不会在每次调用ping
或wait()
时再次运行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")
请让我知道在应用建议的处理方法后错误是否还会消失。