问题描述
我有一台服务器,我使用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个ping的答复后,才会检查返回代码。但是,我要进行的修改是任何一个ping请求成功后,我想立即将其声明为“ Alive”并继续。如果所有4个都失败,则我们将服务器标记为“已死”。我要进行此修改的原因是,当第一个成功答复意味着它的有效运行使脚本运行时间更长时,我要对许多服务器执行ping操作并等待来自每个服务器的4个答复。我相信此修改将使脚本更快地完成。我该如何实现?
解决方法
与其尝试根据其输出停止外部进程,不如一次仅执行一次ping操作并自己实现循环:
max_tries = 4
for _ in range(max_tries):
command = ['ping','-w','1','-c','localhost']
proc = subprocess.run(command)
if proc.returncode == 0:
print("Alive")
break
else:
print("Dead")
else
子句仅在到达for
循环的末尾(即未收到答复)时才执行。修改超时(-w
)以适合您的需求。
ping
命令本身并未提供在收到回复时提前停止的选项。因此,您必须捕获它的输出并终止该过程,这不雅致,并且有很大的潜在故障空间。
这不是您的问题的答案。 @fuenfundachtzig的答案是正确的。
但是,如果您有许多服务器,并且只是使脚本运行得更快,也许下一个代码会有所帮助
<div class="flex-container">
<div class="row">
<span class="flex-item">1</span>
</div>
<div class="row">
<span class="flex-item">2</span>
</div>
<div class="row">
<span class="flex-item">3</span>
</div>
<div class="row">
<span class="flex-item">4</span>
</div>
</div>