ping命令周围的Python包装器在收到pong时停止

问题描述

我有一台服务器,我使用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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...