Обертка Python вокруг команды ping для остановки при получении pong

#python #subprocess #ping

#python #подпроцесс #ping

Вопрос:

У меня есть сервер, на который я отправляю 4 пинга ICMP с использованием Python. Мой код выглядит следующим образом:

 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 завершаются неудачей, мы помечаем сервер как «Мертвый». Причина, по которой я хочу внести это изменение, заключается в том, что я пингую множество серверов и жду 4 ответа от каждого сервера, когда первый успешный ответ означает, что он активен, что продлевает выполнение скрипта. Я считаю, что эта модификация ускорит завершение сценария. Как я могу этого добиться?

Ответ №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 цикла, т. Е. Ответа получено не было. Измените значение timeout ( -w ) в соответствии с вашими потребностями.

Сама ping по себе команда не предоставляет возможности досрочной остановки при получении ответа. Таким образом, вам придется захватить его выходные данные и завершить процесс, что не является элегантным и имеет много возможностей для потенциальных сбоев.