Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python包装器在收到pong时停止ping命令_Python_Subprocess_Ping - Fatal编程技术网

Python包装器在收到pong时停止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个请求的回复后,才会检查

我有一个服务器,我使用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个响应,而第一个成功的响应意味着它的活动将使脚本运行更长时间。我相信这次修改会使脚本完成得更快。如何实现这一点?

与其尝试根据外部进程的输出停止该进程,不如一次执行一次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)