Python包装器在收到pong时停止ping命令
我有一个服务器,我使用Python向它发送4个ICMP ping。我的代码如下所示:Python包装器在收到pong时停止ping命令,python,subprocess,ping,Python,Subprocess,Ping,我有一个服务器,我使用Python向它发送4个ICMP ping。我的代码如下所示: command = ['ping', '-c', '4', '192.168.1.8'] proc = subprocess.run(command) if proc.returncode == 0: print("Alive") else: print("Dead") 在此代码中,每次将发送4个ping请求,并且只有在收到所有4个请求的回复后,才会检查
command = ['ping', '-c', '4', '192.168.1.8']
proc = subprocess.run(command)
if proc.returncode == 0:
print("Alive")
else:
print("Dead")
在此代码中,每次将发送4个ping请求,并且只有在收到所有4个请求的回复后,才会检查返回代码。然而,我要做的修改是,一旦任何一个ping请求成功,我要立即将其声明为“活动”并继续。如果所有4个都失败,那么我们将服务器标记为“死”。我之所以要进行此修改,是因为我正在ping许多服务器,并等待每个服务器的4个响应,而第一个成功的响应意味着它的活动将使脚本运行更长时间。我相信这次修改会使脚本完成得更快。如何实现这一点?与其尝试根据外部进程的输出停止该进程,不如一次执行一次ping,然后自己实现循环:
max_tries = 4
for _ in range(max_tries):
command = ['ping', '-w', '1', '-c', '1', 'localhost']
proc = subprocess.run(command)
if proc.returncode == 0:
print("Alive")
break
else:
print("Dead")
else
子句仅在到达for
循环的末尾,即未收到回复时才会执行。修改超时(-w
)以满足您的需要
ping
命令本身不提供在收到回复时提前停止的选项。因此,您必须捕获其输出并终止该进程,因为该进程并不优雅,并且有很大的潜在失败空间。这不是您问题的答案。
@fuenfundachtzig的答案是清楚和正确的
但是,如果您有许多服务器,并且您只是使您的脚本更快,那么下一个代码可能会有所帮助
import subprocess
HOST = 3
command = [['ping', '-c', '4', '192.168.1.8'], ['ping', '-c', '4', '192.168.1.7']]
pings = [(args[HOST], subprocess.Popen(args)) for args in command]
while len(pings) > 0:
end_pings = []
for ping in pings:
result = ping[1].poll()
if result is not None:
if result == 0:
print(ping[0], ": ", "Alive")
else:
print(ping[0], ": ", "Dead")
end_pings.append(ping)
for end_ping in end_pings:
pings.remove(end_ping)