【问题标题】:Python wrapper around ping command to stop when pong was receivedping 命令的 Python 包装器在收到 pong 时停止
【发布时间】:2021-01-06 01:56:13
【问题描述】:

我有一个服务器,我使用 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 请求成功,我就想立即将其声明为“活着”并继续前进。如果所有 4 个都失败,那么我们将服务器标记为“死亡”。我要进行此修改的原因是我正在 ping 很多服务器并等待来自每个服务器的 4 个回复,当第一个成功回复意味着它的活动使脚本运行更长时间时。我相信这个修改会让脚本更快地完成。我怎样才能做到这一点?

【问题讨论】:

    标签: python subprocess ping


    【解决方案1】:

    与其尝试根据其输出停止外部进程,不如一次执行一个 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 命令本身不提供在收到回复时提前停止的选项。因此,您必须捕获其输出并终止该进程,这并不优雅,并且有很大的潜在失败空间。

    【讨论】:

      【解决方案2】:

      这不是你的问题的答案。 @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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-29
        • 2020-10-25
        • 1970-01-01
        • 2020-10-13
        • 2023-04-02
        • 2012-01-16
        • 2021-05-02
        • 2021-04-21
        相关资源
        最近更新 更多